层序创建二叉树,层序遍历二叉树

在学习树的过程中发现,他们都有一个共同的特点,无论是在创建时还是遍历时,都是需要先父母再左孩子右孩子的顺序如图
层序创建二叉树,层序遍历二叉树_第1张图片
层序遍历时顺序为A->B->C->D->E->F->G,先被访问的结点,他的孩子也是先被访问的,层序创建二叉树时,先创建的结点他的孩子也先创建,符合先进先出原则,因此可以用队列来实现。所以他们的共同点就是都可以用队列来帮助实现。
那就先从较为简单的遍历开始吧!

1.层序遍历

思路:刚才分析时我们发现可用队列,第一步,若根节点不为空我们先让根节点入队,判断他的左右孩子是否为空,若不为空打印根节点并让他的孩子入队。
第二步,取出队列中第一个结点并打印,判断他是否有左右孩子,若有让其孩子入队。
重复第二步直到队列为空。
代码:

static void levelOrder(Node t){
     
        LinkedList<Node> q=new LinkedList();//声明队列
        q.add(t);//根节点入队应该判断一下根节点是否为空,没写懒了
        while(!q.isEmpty()) {
     
            Node p = q.pollFirst();//每次都取出对头结点
            System.out.print(p.data+" ");
            if(p.lchild!=null){
     //若有左孩子左孩子入队
                q.add(p.lchild);
            }
            if(p.rchild!=null){
     //若有右孩子右孩子入队
                q.add(p.rchild);
            }
        }
    }

2.层序创建二叉树

说实话我学习过程中没遇到过层序创建的,但是刷题遇见了一个输入是层序输入的,我当时就想层序怎么创建二叉树呢?其实和层序遍历差不多都是一个思想,先创建的他的孩子也先创建。

    //层序创建二叉树
    static Node cerate_LevelTree(Node node){
     
        LinkedList<Node> q=new LinkedList<Node>();//还是建个队列
        String ch;
        Node p;
        Scanner scanner=new Scanner(System.in);
        ch=scanner.nextLine();//从控制台取出输入第一个结点
        if(!ch.equals("null")){
     //若不为空则让他入队
             node=new Node();//生成一个结点
             node.data=ch;//把输入的数据存进去
            q.add(node);
        }
        while(!q.isEmpty()){
     
            ch=scanner.nextLine();//再从控制台取元素
            p=q.pollFirst();//每次都取出对头结点
            if(ch.equals("null")){
     //若不为空则证明有左孩子
                p.lchild=null;
            }
            else{
     
                p.lchild=new Node();//创建左孩子并入队
                p.lchild.data=ch;
                q.add(p.lchild);
            }
            ch=scanner.nextLine();//再取出一个元素
            if(ch.equals("null")){
     //若不为空则证明有右孩子
                p.rchild=null;
            }
            else{
     
                p.rchild=new Node();//创建右孩子并入队
                p.rchild.data=ch;
                q.add(p.rchild);
            }
        }
        return node;
    }

根据代码,除了根节点都在while循环里,根据控制台输入的字符或者字符串先判断根节点有无左右孩子,若有则创建赋值并入队,若没有就让他的左孩子或者右孩子为空,如此循环往复,直到队列为空。

你可能感兴趣的:(二叉树)