【二叉树的遍历-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;
}
}