二叉树前序,中序,后序,层次,DFS,BFS遍历

遍历思想:

前序遍历:根节点,左子树,右子树

中序遍历:左子树,根节点,右子树

后续遍历:左子树,右子树,根节点

层次遍历:按层顺序遍历即可

代码:

树结点:

class TreeNode{

        int val;

        TreeNode left;

        TreeNode right;

        TreeNode(int x){

        val = x;        

    }

}

1.1前序遍历(递归版)

public void preOrderTraverse1(TreeNode root){

        if(root != null{

        System.out.print(root.val + " ");

        preOrderTraverse1(TreeNode root.left);

        preOrderTraverse1(TreeNode root.right);

    }

}

1.2 前序遍历(非递归版,迭代)

利用栈stack存储结点

public void preOrderTraverse2(TreeNode root){

        Stack<TreeNode> stack = new Stack<TreeNode>();

        TreeNode node = root;

        while(node != null || !stack.isEmpty()){

                while(node != null){

                        System.out.print(node.val + " ");

                        stack.push(node);

                        node = node.left;

                }

                if(!stack.isEmpty()){

                        node = stack.pop();

                        node = node.right;

                }

        }

}

2.1中序遍历(递归版)

public void inOrderTraverse1(TreeNode root){

        if(root != null{

        inOrderTraverse1(TreeNode root.left);

        System.out.print(root.val + " ");

        inOrderTraverse1(TreeNode root.right);

    }

}

2.2 中序遍历(非递归版)

利用栈stack存储结点

public void inOrderTraverse2(TreeNode root){

Stack stack = new Stack();

TreeNode node = root;

        while(node != null || !stack.isEmpty()){

                while(node != null){

                stack.push(node);

                node = node.left;

                }

                if(!stack.isEmpty()){

                node = stack.pop();

               System.out.print(node.val + " ");

                node = node.right;

                }

        }

}

3.1后序遍历(递归版)

public void postOrderTraverse1(TreeNode root){

        if(root != null{

        preOrderTraverse2(TreeNode root.left);

        preOrderTraverse2(TreeNode root.right);

        System.out.print(root.val + " ");

    }

}

3.2后序遍历(非递归法)

后序遍历与前序中序不一样,当后序遍历要保证输出当前结点时要保证左右子树都已经遍历完

设置一个lastVist游标

public static void postOrderTraverse2(TreeNode root){

        Stack<TreeNode> stack = new Stack<TreeNode>();

        TreeNode node = root;

        TreeNode lastVisit = root;

        while(node != null || !stack.isEmpty()){

                whilee(node != null){

                        stack.push(node);

                        node = node.left;

                }

                node = stack.peek();                    //查看当前栈顶元素

                if(node.right == null || node.right == lastVisit){        //如果其右子树也为空,或者右子树已经访问,则可以直接输出当前结点的值

                        System.out.print(node.val + "  ");

                        stack.pop();

                        lastVisit = node;

                        node = null;                        

                }else{                             //否则继续遍历右子树

                        node = node.right;

                }

        }

}

4. 层次遍历

利用队列

public void levelTraverse(TreeNode root){

        if(root == null) return;

        LinkedList<TreeNode> queue = new LinkedList<>();

        queue.offer(root);

        while(!queue.isEmpty()){

                TreeNode node = queue.poll();

                System.out.print(node.val + "  ");

                if(node.left != null)  queue.offer(node.left);

                if(node.right != null) queue.offer(node.right);

        }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 姓名: 李小娜 [嵌牛导读] :这篇文章主要介绍了Java二叉排序树,包括二叉排序树的定义、二叉排序树的性质、二叉...
    n184阅读 3,865评论 0 0
  • 首先,我们来看一下二叉树结构。 二叉树有三种遍历方式: 前序遍历:根左右 ABDCEF 中序遍历:左根右 DBAE...
    乐百事52淑熙阅读 3,647评论 0 0
  • 如需转载, 请咨询作者, 并且注明出处.有任何问题, 可以关注我的微博: coderwhy, 或者添加我的微信: ...
    coderwhy阅读 12,936评论 12 36
  • 周日,儿子睡到11点才起来。起床之后,就拿着手机在房间里玩。我跟他说,你可以告诉我,约定你要玩手机的时间,给我一个...
    迎风飞扬lele阅读 1,148评论 0 2
  • 这个灵感来自于我的好朋友,她在我心中是个坚强,勇敢的学霸。 回首我的2017,最先进入回忆的是三月份拿...
    Hainnay阅读 2,890评论 0 0

友情链接更多精彩内容