非递归遍历二叉树
递归本质上就是栈 由于二叉树提供节点只能向下访问 无法返回 故而使用栈结构实现返回
public static List<Integer> inOrderTraversalBT(TreeNode root) {
List<Integer> res = new ArrayList<>();
//空树则直接返回null的res
if (root == null) {
return res;
}
Stack<TreeNode> stack = new Stack<>();
// 保存root
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
// 向树的最左侧走 并不断压栈
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
// 走完最左侧后弹栈顶
TreeNode node = stack.pop();
res.add(node.val);
// 往上层的右边去再重复找最左侧
cur = node.right;
}
return res;
}
public static List<Integer> preOrderTraversalBT(TreeNode root) {
List<Integer> res = new ArrayList<>();
//空树则直接返回null的res
if (root == null) {
return res;
}
Stack<TreeNode> stack = new Stack<>();
// 保存root
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
// 向树的最左侧走 并不断压栈入数组
while (cur != null) {
res.add(cur.val);
stack.push(cur);
cur = cur.left;
}
// 走完最左侧后弹栈顶 无须入组 cur循环内已经入组
TreeNode node = stack.pop();
// 往上层的右边去 再重复找最左侧
cur = node.right;
}
return res;
}
public static List<Integer> postOrderTraversalBT(TreeNode root) {
List<Integer> res = new ArrayList<>();
//空树则直接返回null的res
if (root == null) {
return res;
}
Stack<TreeNode> stack = new Stack<>();
// 保存root
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
// 向树的最右侧走 并不断压栈入数组
while (cur != null) {
res.add(cur.val);
stack.push(cur);
cur = cur.right; // 使得reverse后正常左在前
}
// 走完最右侧后弹栈顶 无须入组 cur循环内已经入组
TreeNode node = stack.pop();
// 往上层的左边去 再重复找最右侧
cur=node.left;
}
Collections.reverse(res);
return res;
}