【二叉树的遍历-2】中序遍历(递归与非递归)

【二叉树的遍历-1】前序遍历(递归与非递归)
【二叉树的遍历-3】后序遍历(递归与非递归)
【二叉树的遍历-4】层序遍历

中序遍历

中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历、中序周游。在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。

所以中序遍历只用记住一点:左子树–> 根结点 --> 右子树

递归实现:

上一篇前序遍历写的一样,对于递归过程我们其实不需要太在意,主要是要想清楚让计算机干什么。
比如这里我们我们想先打印根节点的左子树,再打印根节点,再打印根节点的右子树。我们就只用告诉计算机打印次序,让它自己递归调用就可以了。

  • 终止条件:当前节点为空时
  • 在函数内: 递归的调用左节点,打印当前节点,再递归调用右节点

具体代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
 class  BinaryTree {
    public void inorderTraversal(TreeNode root) {
        if(root != null) {
            inorderTraversal(root.left);    //一直递归调用到左子树为空,其实就相当于已经遍历了左子树
            System.out.println(root.val);   //所以按照次序,这里直接打印根节点
            inorderTraversal(root.right);   //然后递归调用,遍历右子树节点
        }
    }
}

非递归实现:
跟前序遍历有点像,依然是借助栈来完成遍历。
思路如下:

  • 先创建一个Stack,用来保存节点并输出
  • 尽可能的将跟节点的左子树压入Stack,此时栈顶的元素便是最左侧的元素。并且其没有左子树了,相当于左子树遍历完毕,直接把它弹出栈打印就好
  • 如果它有右节点,其也要进行中序遍历
  • 然后它相当于其上层节点的左子树,返回上层节点时,相当于其左子树已经遍历完毕,直接弹出栈打印就好,然后再对其右子树中序遍历,成功的了重复上面的步骤,再回到它的上层,形成迭代。

具体代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class  BinaryTree {
    public void inorderTraversal(TreeNode root) {
        if(root == null) {   //传的根节点为空直接返回,不用遍历了
            return;
        }
        Stack<TreeNode> s = new Stack<>();
        TreeNode cur = root;   //定义一个引用指向头节点,用来遍历二叉树
        while(cur!=null || !s.empty()) {  //循环条件:cur!=null 或者栈不为空时说明还没遍历完
            while(cur != null) {
                s.push(cur);       //尽可能将节点左子树依次压入栈中
                cur = cur.left;
            }
            //此时栈顶的元素是最左侧的元素,它的左子树为空,相当于左子树已经遍历了,直接将其出栈并打印
             cur = s.pop();    
             System.out.println(cur.val); 
             cur = cur.right;  //左子树与根都遍历了,此时应该遍历它右节点了
        }
    }
}

附leetcode中序非递归遍历代码

题目链接点击直达

代码如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ret = new ArrayList<>();
        if(root == null) {
            return ret;
        }
        Stack<TreeNode> s = new Stack<>();
        TreeNode cur = root;
        while(  cur!=null||!s.empty()) {
            while(cur != null) {
                s.push(cur);     
                cur = cur.left;
            }
            cur = s.pop();    
            ret.add(cur.val); 
            cur = cur.right;  
        }
        return ret;
    }
}
发布了27 篇原创文章 · 获赞 57 · 访问量 927

猜你喜欢

转载自blog.csdn.net/A_K_L/article/details/104851020