前序遍历
思路:全局指针,指向根节点,所到节点立即访问,然后把节点入栈,往左走。
当左子树为空时,pop栈顶节点,如果栈顶右子树不空,把全局指针往右走,继续循环。
循环结束条件:栈为空并且全局指针为null时。
public static void preIte(TreeNode root){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode temp = root;
while(!stack.isEmpty() || temp != null){
if(temp != null){
System.out.println(temp.val);
stack.add(temp);
temp = temp.left;
}else{
temp = stack.pop();
temp = temp.right;
}
}
}
中序遍历
思路:全局指针,初始指向根节点,循环入栈,直到全局指针的左子树为空。
pop栈顶节点并访问,如果栈顶节点的右子树不为空,则全局指针往右走,继续循环。
循环结束条件:栈空或者全局指针为null时。
public static void midIte(TreeNode root){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode temp = root;
while(temp != null || !stack.isEmpty()){
while(temp != null){
stack.add(temp);
temp = temp.left;
}
if(!stack.isEmpty()){
temp = stack.pop();
System.out.println(temp.val);
temp = temp.right;
}
}
}
后序遍历
思路:全局指针+上一次遍历节点的指针,首先根节点入栈。
如果全局指针现在指向的节点没有左右孩子 或者 全局指针指向的节点的左孩子或者右孩子是上一次遍历的节点,则
遍历当前节点,并出栈,同时上一次遍历的节点指向此节点。否则,当前节点的右孩子若不为空,右孩子入栈,当前节点的左孩子不为空,左孩子入栈。
循环结束条件:栈空。
public static void postIte(TreeNode root){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode temp = root;
TreeNode preNode = null;
if(temp != null) stack.add(temp);
while(!stack.isEmpty()){
temp = stack.peek();
if((temp.right == null && temp.left == null) ||
(preNode != null && (temp.left == preNode || temp.right == preNode))){
System.out.println(temp.val);
stack.pop();
preNode = temp;
}else{
if(temp.right != null)
stack.add(temp.right);
if(temp.left != null)
stack.add(temp.left);
}
}
}