1.二叉树非递归遍历遍历
(1)前序遍历思路(Binary Tree Preorder Traversal)
Tree root; //传入的树
stack s; //用来存储所有根节点的栈
list result; //存储遍历结果
//树遍历过程
while(!s.isEmpty || root != null){
//将树的所有根节点入栈(每个节点都可看作一棵树的根节点)
while(root != null){
s.push(root);
result.push(root.val); //处理遍历结果
root=root.left;
}
//出栈
root = s.pop().right; //继续循环入栈
}
(2)中序遍历思路( Binary Tree Inorder Traversal)
<pre name="code" class="java"> Tree root; //传入的树
stack s; //用来存储所有根节点的栈
list result; //存储遍历结果
//树遍历过程
while(!s.isEmpty || root != null){
//将树的所有根节点入栈(每个节点都可看作一棵树的根节点)
while(root != null){
s.push(root);
root=root.left;
}
//出栈
root = s.pop(); //出栈操作
result.push(root.val); //处理遍历结果
root=root.right;<span style="white-space:pre"> </span>//继续循环入栈
}
(3)后续遍历思路(
Binary Tree Postorder Traversal)
Tree root; //传入的树
stack s; //用来存储所有根节点的栈
list result; //存储遍历结果
Tree temp = null; //用来临时存储树节点,判断是否是树的右孩子
//树遍历过程
while(!s.isEmpty || root != null){
//将树的所有根节点入栈(每个节点都可看作一棵树的根节点)
while(root != null){
s.push(root);
root=root.left;
}
//出栈
root = s.peek().right;
if(root == null || root == temp){
temp = s.pop();
result.add(temp.val);
root = null;
if(!s.isEmpty()){
if(temp != s.peek().right)
root = s.peek().right;
else{
temp = s.pop();
result.add(temp.val);
}
}
}
}
总结: 对于前序遍历,就是循环入栈,在入栈时对该节点进行处理;然后栈顶元素出栈,指针指向当前栈顶元素的右孩子继续循环入栈。
对于中序遍历,就是循环入栈;然后栈顶元素出栈,在出栈时对该节点进行处理,指针指向当前栈顶元素的右孩子继续循环入栈。
对于后序遍历,同样循环入栈;判断栈顶元素的右孩子是否是为空,如果为空则栈顶元素出栈,并对该节点进行处理;判断出栈的节点是否为栈顶节点的右孩子节点,若为右孩子继续出栈,否则指针指向当前栈顶元素的右孩子继续循环入栈。