一、前序遍历
NLR:前序遍历(Preorder Traversal 亦称先序遍历)
访问根结点—>根的左子树—>根的右子树。
//非递归前序遍历
public void preOrderTraversalNor(Node root) {
if(root == null) {
return;
}
Stack<Node> stack = new Stack<>();
Node cur = root;
while(cur != null ||!stack.isEmpty()) {
while(cur != null) {
System.out.println(cur.val+" ");
stack.push(cur);
cur = cur.left;
}
Node top = stack.pop();
cur = top.right;
}
}
二、中序遍历
LNR:中序遍历(Inorder Traversal)
根的左子树—>根节点—>根的右子树。
//非递归中序遍历
public void inOrderTraversalNor(Node root){
if(root == null) {
return;
}
Stack<Node> stack = new Stack<>();
Node cur = root;
while(cur != null || !stack.isEmpty()) {
while(cur != null) {
stack.push(cur);
cur = cur.left;
}
Node top = stack.pop();
System.out.println(cur.val + " ");
cur = top.right;
}
}
三、后序遍历
LRN:后序遍历(Postorder Traversal)
根的左子树—>根的右子树—>根节点。
//非递归后序遍历
public void postOrderTraversalNor(Node root) {
if (root == null) return;
Stack<Node> stack = new Stack<>();
Node cur = root;
Node prev = null;
while (cur != null ||!stack.empty()) {
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
cur = stack.peek();//D
if (cur.right == null || cur.right == prev) {
stack.pop();
System.out.print(cur.val + " ");
prev = cur;
cur = null;
} else {
cur = cur.right;
}
}
}