前文
中序遍历就是先找左孩子-再找父节点-最后找右孩子
本文给出一个二叉树如下图一并且直接给出Java的写法,然后一步步拆分中序遍历入栈和出栈的过程,可以帮助新手理解栈和递归。
中序遍历有一个点就是它遍历出来的数据是升序的。
图一:二叉树
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode curr = root;
while (curr != null || !stack.isEmpty()) {
while (curr != null) {
stack.push(curr);
curr = curr.left;
}
curr = stack.pop();
res.add(curr.val);
curr = curr.right;
}
return res;
}
}
步骤
监听栈的使用情况:stack
stack.push(A);
A
stack.push(B);
BA
stack.push(D);
DBA
stack.pop(D);
BA
stack.pop(B);
A
stack.push(E);
EA
stack.push(H);
HEA
stack.pop(H);
EA
stack.pop(E);
A
stack.pop(A);
暂时为空
stack.push(C);
C
stack.push(F);
FC
stack.pop(F);
C
stack.push(I);
IC
stack.pop(I);
C
stack.pop(C);
暂时为空
stack.push(G);
G
stack.pop(G);
后面再无添加真的为空
stack为空递归完成。
图解
每一个颜色就是一个二叉树
每个二叉树遵循左根右的遍历规则