int same_parents(SqTree T,int i,int j){
int i_par = i/2;
int j_par = j/2;
while(i_par != 1 && j_par != 1){
if(i_par == j_par)
return i_par;
else if(i_par < j_par)
i_par = i_par/2;
else
j_par = j_par /2
}
return 1;
}
typedef struct BiTNode{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree;
//递归先序
void PreOrder(BiTree T){
if(T != NULL){
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
//非递归中序
//树不空:则结点入栈,p向其左子树遍历;
//树空栈不空,出一个,p向其(出栈结点)右孩子遍历;
//树空栈空,遍历结束;
//口诀:“入栈一直想左走,出栈访问右子树”。
void InOrder(BiTree T){
InitStack(S);//栈初始化
BiTree p = T;
while(p!=NULL || !IsEmpty(S)){//二叉树和栈有一个不空就继续循环
if(p){
push(S,p);
p = p->lchild;
}
else{//s不空,p空(树空栈不空)
pop(S,p);
visit(p);//第二次遇到该结点时才访问
p = p->rchild;
}
}//while end
return ;
}
void PreOrder(BiTree T){
InitStack(S);
BiTree p = T;
while(p!=NULL || !IsEmpty(S)){
if(p){
visit(p);//第一次遇到该结点时就访问
push(S,p);
p = p->lchild;
}
else{
pop(S,p);
p = p->rchild;
}
}//while end
return ;
}
复习的时候画个树自己模拟一遍;
bool GetTop(SqStack S,BiTree &x){
if(S.top == -1)
return false;
x = S.data[S.Top];//x记录栈顶元素
return true;
}
void PostOrder(BiTree T){
InitStack(S);
BiTree p = T;
BiTree r = NULL;//r指向最近访问的结点
while(p || !isEmpty(S)){
if(p){
push(S,p);
p = p->lchild;//和中序一样的
}
else{
GetTop(S,p);
if(p->rchild!=NULL && p->rchild!=r){//p有右孩子且未访问
p = p->rchild;
push(S,p);//右孩子入栈
p = p->lchild;
}
else{//p没有右孩子或右孩子已被访问(这条不太可能因为后序一定先访问他的右孩子)
pop(S,p);
visit(p);
r = p;
p = NULL;
}
}//else(!p) end
}//while end
return ;
}
void levelOrder(BiTree T){
InitQueue(Q);
BiTree p;
inQueue(Q,T);//根结点入队
while(!isEmpty(Q)){
outQueue(Q,p);
visit(p);
if(p->lchild)
inQueue(p->lchild);
if(p->rchild)
inQueue(p->rchild);
}//while end
return ;
}