- 问题描述
实现非递归遍历树
①先序
②中序
③后序遍历请点击此链接
链接: link. - 解决思路
①先序
1> 特殊情况: 如果根为空, 直接返回
2> 如果不为空树
先将根节点压入栈中
当栈不为空时, 进行循环
弹出栈顶元素并输出, 然后将栈顶元素的右孩子先压入栈, 再压入左孩子 (因为栈是先进后出, 所以进行循环的时候就是左孩子先出栈.
②中序
1> 特殊情况: 如果根为空, 直接返回
2> 如果不为空树, 设置一个 cur 引用,使其指向树的根部.
当栈不空或者 cur 不为空时, 进行循环
如果 cur 不为空, 就将 cur 压栈, 并使 cur 指向它的左子树 cur = cur.left;
否则就弹出栈顶元素并输出, 使 cur 指向它的右子树 cur = cur.right;
直到栈为空且 cur 也为空, 说明所有节点都遍历完了.
// 如果不为空树, 设置一个 cur 引用,使其指向树的根部
TreeNode cur = root;
当栈不空和或者当前节点 (cur) 不空时)
// 当栈不空和或者当前节点 (cur) 不空时)
!stack.isEmpty() || cur != null;
将 粗人, 再将右孩子压入栈中,最后将左孩子压入栈中.
3. 源代码
①先序
public class PreTraversal {
Deque<TreeNode> stack = new LinkedList<>();
public void preTraversal1(TreeNode root) {
if (root == null) {
return;
}
this.stack.push(root);
while (!this.stack.isEmpty()) {
TreeNode node = this.stack.pop();
System.out.print(node.var);
if (node.right != null) {
this.stack.push(node.right);
}
if (node.left != null) {
this.stack.push(node.left);
}
}
}
}
②中序
public class InTraversal {
public void inTraversal1(TreeNode root) {
TreeNode cur = root;
Deque<TreeNode> stack = new LinkedList<>();
if (root == null) {
return;
}
while (!stack.isEmpty() || cur != null) {
if (cur != null) {
stack.push(cur);
cur = cur.left;
} else {
cur = stack.pop();
System.out.print(cur.var);
cur = cur.right;
}
}
}
}