目录
要注意的点:需要进行两次嵌套循环,如果不进行判断那么并没有办法去判断什么时候进行停止打印
前序遍历
要注意的点:需要进行两次嵌套循环,如果不进行判断那么并没有办法去判断什么时候进行停止打印
当栈里面都为空的时候停止打印
public void preOrderNer(TreeNode root) {
//如果root等于空那么就return,如果不为空那么就需要一个栈
if (root == null) {
return;
}
//非递归的前序也要拿栈去做
TreeNode cur = root;//需要定义一个cur,因为root不能动
Deque<TreeNode> stack = new ArrayDeque<>();
while (cur != null || !stack.isEmpty()) {
while (cur != null) {
stack.push(cur);//把cur放到栈里
System.out.print(cur.val);//把第一个是字符进行打印
cur = cur.left;
}
TreeNode top = stack.pop();
cur = top.right;
}
System.out.println();
}
中序遍历:
中序遍历和后续遍历思想一样,只不过需要把打印的位置进行改变
public void inOrderNer(TreeNode root) {
//如果root等于空那么就return,如果不为空那么就需要一个栈
if (root == null) {
return;
}
//非递归的前序也要拿栈去做
TreeNode cur = root;//需要定义一个cur,因为root不能动
Deque<TreeNode> stack = new ArrayDeque<>();
while (cur != null || !stack.isEmpty()) {
while (cur != null) {
stack.push(cur);//把cur放到栈里
//System.out.println(cur.val);//把第一个是字符进行打印
cur = cur.left;
}
TreeNode top = stack.pop();
System.out.print(top.val);
cur = top.right;
}
后序遍历:
注意:pop和peek的区别:
pop是进行弹出操作,peek 不进行弹出,只是看一眼这个元素
如果不进行if条件句的判断,那么如果存在右数存在的一个情况就会进入死循环
解决方法:
定义一个元素等于null
然后将这个元素与top的值进行对比
public void postOrderNer(TreeNode root) {
if (root == null) {
return;
}
TreeNode cur = root;
TreeNode prev = null;
Deque<TreeNode> stack = new ArrayDeque<>();
while (cur != null || !stack.isEmpty()) {
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
TreeNode top = stack.peek();
if (top.right == null || top.right == prev) {
System.out.print(top.val + " ");
stack.pop();
prev = top;
} else {
cur = top.right;
}
}
}