风也温柔

计算机科学知识库

二叉树遍历算法 java 二叉树各种遍历我都帮你总结好了,附有堆栈队列图解,建议收藏,巩固基础

  靓仔靓女们大家好,我是公众号:java小杰要加油,现在就职京东,不定期分享京东面试真题以及java相关知识,今天我来分享一篇关于二叉树的文章(建议收藏,便于巩固基础)。 二叉树介绍

  二叉树( tree) 是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。

  二叉树的递归定义为: 二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树

  遍历二叉树java算法_二叉树遍历算法 java_用文字描述先(根)序的遍历二叉树算法算法,中(根)序的遍历二

  二叉树相关属性解释: 结点:包含一个数据元素及若干指向子树分支的信息。 结点的度:一个结点拥有子树的数目称为结点的度。 叶子结点:也称为终端结点,没有子树的结点或者度为零的结点。 分支结点:也称为非终端结点,度不为零的结点称为非终端结点。 树的度:树中所有结点的度的最大值。 结点的层次:从根结点开始,假设根结点为第1层,根结点的子节点为第2层,依此类推,如果某一个结点位于第L层二叉树遍历算法 java 二叉树各种遍历我都帮你总结好了,附有堆栈队列图解,建议收藏,巩固基础,则其子节点位于第L+1层。 树的深度:也称为树的高度,树中所有结点的层次最大值称为树的深度。 有序树:如果树中各棵子树的次序是有先后次序二叉树遍历算法 java二叉树遍历算法 java,则称该树为有序树。 * 无序树:如果树中各棵子树的次序没有先后次序,则称该树为无序树。

  二叉树遍历方式

  例如一个这个样子的二叉树,按三种遍历方法分别遍历,输出的结果分别是

  二叉树遍历算法 java_遍历二叉树java算法_用文字描述先(根)序的遍历二叉树算法算法,中(根)序的遍历二

  下面我们一起来用代码实现下这三种遍历

  二叉树递归遍历

  * 前序遍历 ( 144)

   class Solution {

        //声明列表
        ArrayList list = new ArrayList();
        public List preorderTraversal(TreeNode root) {
            // 如果根节点为空,则直接返回空列表
            if (root == null){
                return  new ArrayList();
            }
            //节点不为空,将节点的值添加进列表中    
            list.add(root.val);
            //判断此节点的左节点是否为空,如果不为空则将递归遍历左子树
            if (root.left != null){
                preorderTraversal(root.left);
            }
            //判断此节点的右节点是否为空,如果不为空则将递归遍历右子树
            if (root.right != null){
                preorderTraversal(root.right);
            }
            //最后返回列表
            return list;
        }

   class Solution {

        //声明列表
        ArrayList list = new ArrayList();
        public List inorderTraversal(TreeNode root) {
            // 如果根节点为空,则直接返回空列表
            if (root == null){
                return  new ArrayList();
            }
            //判断此节点的左节点是否为空,如果不为空则将递归遍历此节点的左子树
            if (root.left != null){
                inorderTraversal(root.left);
            }
            //节点不为空,将节点的值添加进列表中
            list.add(root.val);
            //判断此节点的右节点是否为空,如果不为空则将递归遍历此节点的右子树
            if (root.right != null){
                inorderTraversal(root.right);
            }
            //最后返回列表
            return list;
        }

   class Solution {

        //声明列表
        ArrayList list = new ArrayList();
        public List postorderTraversal(TreeNode root) {
            // 如果根节点为空,则直接返回空列表
            if (root == null){
                return  new ArrayList();
            }
            //判断此节点的左节点是否为空,如果不为空则将递归遍历此节点的左子树
            if (root.left != null){
                postorderTraversal(root.left);
            }
            //判断此节点的右节点是否为空,如果不为空则将递归遍历此节点的右子树
            if (root.right != null){
                postorderTraversal(root.right);
            }
            //节点不为空,将节点的值添加进列表中
            list.add(root.val);
            //最后返回列表
            return list;
        }

  我们通过观察发现,这代码怎么这么像,是的就是很像,他们唯一的区别就是list.add(root.val);代码的位置不一样,这行代码就代表文中的 遍历(访问)

  下图中为前序遍历(根左右)

  遍历二叉树java算法_二叉树遍历算法 java_用文字描述先(根)序的遍历二叉树算法算法,中(根)序的遍历二

  下图中为中序遍历(左根右)

  用文字描述先(根)序的遍历二叉树算法算法,中(根)序的遍历二_二叉树遍历算法 java_遍历二叉树java算法

  下图中为后序遍历(左右根)

  二叉树遍历算法 java_遍历二叉树java算法_用文字描述先(根)序的遍历二叉树算法算法,中(根)序的遍历二

  二叉树非递归遍历

   class Solution {

        List list =   new ArrayList();
        public List preorderTraversal(TreeNode root) {
            //如果根节点为空,则直接返回空列表
            if(root==null){
                return  new ArrayList();
            }
            //声明一个栈
            Stack stack = new Stack();
            //将节点入栈
            stack.push(root);
            //如果栈不为空
            while (!stack.empty()){
                //从栈弹出这个节点
                TreeNode node = stack.pop();
                //添加进列表中
                list.add(node.val);
                // 如果这个节点的右子节点不为空
                if (node.right!=null){
                    // 将其入栈  因为栈是先进后出,所以先压栈右子节点  后出
                    stack.push(node.right);
                }
                // 如果这个节点的左子节点不为空
                if (node.left!=null){
                    // 将其入栈 因为栈是先进后出,所以后压栈左子节点 先出
                }
            }
            //返回列表
            return list;
        }

  遍历二叉树java算法_用文字描述先(根)序的遍历二叉树算法算法,中(根)序的遍历二_二叉树遍历算法 java

  用文字描述先(根)序的遍历二叉树算法算法,中(根)序的遍历二_二叉树遍历算法 java_遍历二叉树java算法

   class Solution {

        public List inorderTraversal(TreeNode root) {
            //判断节点是否为空,为空的话直接返回空列表
            if (root == null){
                return new ArrayList();
            }
            //声明列表存储结果
            List list =  new ArrayList();
            //声明一个栈
            Stack stack = new Stack();
            //当节点不为空或者栈不为空时
            while (root != null || !stack.empty()){
                //当节点不为空时
                while (root != null){
                    //将节点压栈
                    stack.push(root);
                    //将节点指向其左子节点
                    root = root.left;
                }
                //如果栈不为空
                if (!stack.empty()){
                    //将栈里元素弹出来
                    TreeNode node = stack.pop();
                    //添加进列表中
                    list.add(node.val);
                    //将节点指向其右子节点
                    root = node.right;
                }
            }
            return list;
        }

  用文字描述先(根)序的遍历二叉树算法算法,中(根)序的遍历二_二叉树遍历算法 java_遍历二叉树java算法

  用文字描述先(根)序的遍历二叉树算法算法,中(根)序的遍历二_遍历二叉树java算法_二叉树遍历算法 java

   class Solution {

        public List postorderTraversal(TreeNode root) {
            // 如果根节点为空,则直接返回空列表
            if (root == null){
                return  new ArrayList();
            }
            //声明列表
            ArrayList list = new ArrayList();
            //声明栈A
            Stack stackA = new Stack();
            //声明栈B
            Stack stackB = new Stack();
            //将次元素压入栈A
            stackA.push(root);
            //当栈A不为空时
            while (!stackA.empty()){
                //取出其中压入的元素
                TreeNode node = stackA.pop();
                //压入栈B中
                stackB.push(node);
                //当此节点左子节点不为空时
                if (node.left != null){
                    //压入栈A
                    stackA.push(node.left);
                }
                //当此节点右子节点不为空时
                if (node.right != null){
                    //压入栈A
                    stackA.push(node.right);
                }
            }
            //当栈B不为空时
            while (!stackB.empty()){
                //取出其元素并且添加至列表中
                TreeNode node = stackB.pop();
                list.add(node.val);
            }
            //最后返回列表
            return list;
        }

  二叉树遍历算法 java_用文字描述先(根)序的遍历二叉树算法算法,中(根)序的遍历二_遍历二叉树java算法

  用文字描述先(根)序的遍历二叉树算法算法,中(根)序的遍历二_遍历二叉树java算法_二叉树遍历算法 java

  二叉树层序遍历(BFS)

<p><pre>class Solution {

public List levelOrder(TreeNode root) {
    if (root == null) {
        return new ArrayList();
    }
    // 声明一个列表存储每一行的数据
    List result = new ArrayList();
    //声明一个队列
    LinkedList queue = new LinkedList();
    //如果根节点不为空,将其入队
    queue.offer(root);
    //当队列不为空时,代表队列里有数据
    while (!queue.isEmpty()) {
        //存储每一行的数据line
        List line = new ArrayList();
        //保存队列中现有数据的个数,这些就是要添加至每一行列表的值
        int size = queue.size();
        for (int i=0;i