树 的遍历:
1.前序遍历
2.中序遍历
3.后序遍历
4.层次遍历
前三者区别即每个父节点相对于它的左右子树的遍历顺序。
先于左右子树为前序,后于左右子树为后序遍历。
于左右子树之间为中序。
一。前序遍历
二叉树是一种半线性结构
实现:1.递归
2.迭代
二.中序遍历:
1. 思路
首先接受访问的是左侧链末端的节点,继而它的右子树被遍历。
此时控制权会回到谦让它上层的上层结点。
此后依次按照这个过程对该结点遍历,再对它的右子树进行遍历。
2.构思
谦让的次序自顶向下,则访问的次序大致上是自底向上。
所以可以采用栈的方式实现
三。层次遍历
顺序遍历,
采用队列来实现。
看着老师代码敲得,不标准,大概表达了意思,理解就好。
某些子函数也没写出来!
//中序遍历的实现
//迭代的方法 整理复杂度是线性的 O(N)
void goalongleftbranch( Binnodeposi(T) x, Stack <Binnodeposi(T)> &S)
{//功能子函数 ,实现当前节点X 在沿左侧链不断下行中 将每个节点依次入栈
while (x){
S.push(x);
x=x->lchild;
}
}
void travin_I1(Binnodeposi(T) x,V& visit) {
Stack<Binnodeposi(T)> S;
while(true){
goalongleftbranch(x,S); 将左侧链依次逆序入栈
if(S.empty())break; 所有节点处理完毕
x=S.pop();
visit(x->data);
x=x->rchild;
}
}
//前序遍历 的实现
//递归实现
void traverse(Binnodeposi(T) x,VST &visit){
if(!x)
return ;
visit (x->data);
traverse(x->lchild,visit);
traverse(x->rchild,visit);
} //线性的时间复杂度。。。渐进的意义
//迭代实现一
void travpre(Binnodeposi(T) x,VST & visit){
Stack<Binnodeposi(T)>S;
if(x)S.push(x);
while(!S.empty()){
x=S.pop();
visit(x->data);
if(Hasrchild(*x))S.push(x->rchild); //右孩子先入后出
if(Haslchild(*x))S.push(x->lchild); //左孩子后入先出
}
}
//迭代实现二
//子函数
void visitalongleftbranch(Binnodeposi(T)x,VST &visit,Stack<Binnodeposi(T)>&S){
while(x){ //每次访问当前结点,然后将右孩子入栈
visit(x->data);
S.push(x->rchild);
x=x->lchild;
}
}
//主算法
void travpre2(Binnodeposi(T)x,VST &visit){
Stack<Binnodeposi(T)>S;
while(true){
visitalongleftbranch(x,visit,S);
if(S.empty())break;
x=S.pop();
}
}