前序中序后序,按层次。
这里递归的很好写就不写了,主要复习非递归的。
树: 4
2 6
1 3 5 7
8
10
非递归前序:
/**
UnRecursive PreOrder, 非递归前序遍历
**/
PreOrder(BinaryTree<T> root) {
Stack s = new Stack();
Node n = root ;
s.push(n) ;
while(n!=null || !s.empty()) {
while(n!=null) {
println(n)
n = n->left
s.push(n)
}
if(!s.empty()) {
n = s.pop();
s.push(n->right) ;
}
}
}
非递归前序遍历: 4 2 1 3 6 5 7 8 10
首轮写的时候两个忘记的地方:
//非递归前序遍历没注意到的两个问题:
1)n!=null || !s.empty() 应该是||,因为访问至最左下角1的时候,需要先将1的left进栈,发现空后pop1,
然后push1的右孩子,其实还是空,然后进入下一个大循环,此时如果使用&&就跳出了,应该用||使得继续直接执行至pop1的父亲2,然后继续。
2) if(!s.empty()) { } //注意这里栈pop前添加判断有助于防止空栈溢出。
/**
UnRecursive InOrder, 非递归中序遍历
**/
InOrder(BiNode T) {
Stack s = new Stack() ;
while(T!=null||!s.empty()) {
while(T!=null) {
s.push(T->left) ;
T = T->left ;
}
if(!s.empty()) {
T = s.pop() ;
println(T);
T = T->right ;
}
}
}
非递归中序遍历:1 2 3 4 5 6 7 8 10