墨歆洹 2021-11-21 22:41 采纳率: 66.7%
浏览 27
已结题

如何用层序遍历一个普通的二叉树,并把它以完全二叉树的形式存入数组内呢?为空的地方存入null这种思路

如何用层序遍历一个普通的二叉树,并把它以完全二叉树的形式存入数组内呢?为空的地方存入null这种思路,想了半天都没法实现,

  • 写回答

2条回答 默认 最新

  • _Mr.Tree 2021-11-22 20:59
    关注
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Queue;
    
    public class Test {
    
        static class TreeNode{
            TreeNode left;
            TreeNode right;
            int val;
    
            public TreeNode(TreeNode left, TreeNode right, int val) {
                this.left = left;
                this.right = right;
                this.val = val;
            }
        }
    
        public static void main(String[] args) {
            TreeNode seven = new TreeNode(null, null, 7);
            TreeNode eight = new TreeNode(null, null, 8);
            TreeNode four = new TreeNode(seven, eight, 4);
            TreeNode nine = new TreeNode(null, null, 9);
            TreeNode ten = new TreeNode(null, null, 10);
            TreeNode five = new TreeNode(nine, ten, 5);
            TreeNode two = new TreeNode(four, five, 2);
    
            TreeNode eleven = new TreeNode(null, null, 11);
            TreeNode twelve = new TreeNode(null, null, 12);
            TreeNode six = new TreeNode(eleven, twelve, 6);
            TreeNode three = new TreeNode(null, six, 3);
    
            TreeNode one = new TreeNode(two, three, 1);
    
            levelTraver(one).forEach(e -> System.out.print((e == null ? "null" : e.val) + " "));
    
        }
    
        private static List<TreeNode> levelTraver(TreeNode root){
            List<TreeNode> resultList = new ArrayList<>();
            if(root == null) return resultList;
            Queue<TreeNode> q = new LinkedList<>();
            boolean hasChild = false;
            q.offer(root);
            if(root.left != null || root.right != null) hasChild = true;
            while(!q.isEmpty()){
                int len = q.size();
                boolean isAllNull = true;
                boolean nextHasChild = false;
                for(int i = 0; i < len; i++){
                    resultList.add((root = q.poll()));
                    if(root == null){
                        if(hasChild){
                            q.offer(null);
                            q.offer(null);
                        }
                        continue;
                    }
                    isAllNull = false;
                    if(root.left != null){
                        q.offer(root.left);
                        nextHasChild = true;
                    }else if(hasChild){
                        q.offer(null);
                    }
                    if(root.right != null){
                        q.offer(root.right);
                        nextHasChild = true;
                    }else if(hasChild){
                        q.offer(null);
                    }
                }
                hasChild = nextHasChild;
                if(isAllNull){
                    while(len-- > 0){
                        resultList.remove(resultList.size() - 1);
                    }
                    break;
                }
            }
            return resultList;
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月30日
  • 已采纳回答 11月22日
  • 修改了问题 11月21日
  • 创建了问题 11月21日

悬赏问题

  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题