1、二叉树迭代遍历
1.1、前序遍历
前序遍历是中左右,如果还有左子树就一直向下找。完了之后再返回从最底层逐步向上向右找。
public static List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while (!stack.isEmpty() || cur != null){
while (cur != null){
res.add(cur.val);
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
cur = cur.right;
}
return res;
}
1.2、中序遍历
再看中序遍历,中序遍历是左中右,先访问的是二叉树左子数的节点,然后一层一层向下访问,直到到达数左面的最底部,在开始处理节点(也就是把节点的数值放进res列表中)。再使用迭代法写中序遍历,就需要借助指针的遍历来帮助访问节点,栈则用来处理节点上的元素。
public static List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while (!stack.isEmpty() || cur != null){
while (cur != null){
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
res.add(cur.val);
cur = cur.right;
}
return res;
}
1.3、后续遍历
利用反转法,左右中 反转后变为 中右左,中右左 参照 前序(中左右)求得,然后再反转得到后序
public static List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while (!stack.isEmpty() || cur != null){
while (cur != null){
res.add(cur.val);
stack.push(cur);
cur = cur.right;
}
cur = stack.pop();
cur = cur.left;
}
Collections.reverse(res);
return res;
}