树
文章目录
一、查找值为x结点的二叉树双亲结点
BTNode findParent(BTNode *T,int x){
if(T){
if(T->lchild&&(T->lchild->data==x))
return T;
if(T->rchild&&(T->rchild->data==x))
return T;
findParent(T->lchild,x);
findParent(t->rchild,x);
}
}else{
return NULL;
}
}
二、求二叉链表前根序列处于k位置的结点
int trave(BTNode *T,int k){
int n=0;
if(T){
++n;
if(n==k){
return T->data;
}
trave(T->lchild,k);
trave(T->rchild,k);
}
}
三、二叉树所有结点
1.计算二叉树所有结点值之和
int count(BTNode *T){
int n=0;
if(T){
n=n+T->data;
count(T->lchild);
count(T->rchild);
}
return n;
}
2.计算二叉树所有的结点数
int count(BTNode *T){
int n=0;
if(T){
++n;
count(t->lchild);
count(t->rchild);
}
return n;
}
四、打印输出值为x结点的所有祖先
bool Ancestors(BiTree T,int x){
if(T==NULL)//空树
return false;
if(T->data==x)//此结点的值为X
return true;
if(Ancestors(T->lchild,x)||Ancestors(T->rchild,x)){
vist(T->data);//打印T的值
return true; //返回上一层
}
return false; //没有找到,返回false
}
五、打印输出值为x结点的所在层次
int ladder(BTNode *T,int x){
int n=0;
if(T){
n++;
if(T->data==x){
return n;
}
ladder(T->lchild,x);
ladder(T->rchild,x);
}
}
六、计算所有叶子结点数
void count(BTNode *T){
int n;
if(T){
if(T->lchild==NULL&&T->rchild==NULL){
++n;
}
count(T->lchild);
count(T->rchild);
}
}
七、求二叉链表深度
int getDepth(BTNode *T){
int LD,RD;
if(T){
LD=getDepth(T->lchild);
RD=getDepth(T->rchild);
return (LD>RD?LD:RD)+1;
}else{
return 0;
}
}
八、顺序存储二叉树,找到编号为i和j结点的最近的共同祖先
1.二叉树的顺序存储(完全二叉树和满二叉树用此方式比较多,而在普通二叉树的情况下会将其补充数据伪装成一个满二叉树来存储,方便使用满二叉树的特性)
2.为了维持二叉树的节点顺序和数组顺序一致可以从1开始存储
3.祖先节点是子节点的 1/2
int sameParent(sqTree *T,int i,int j){
if(T[i]&&T[j]){
while(j-i){
if(i>j){
i=i/2;
}else{
j=j/2;
}
}
}
return i;
}
九、所有左右子树交换
void exchange(BTNode *T){
if((T->lchild)&&(T->rchild)){
BTNode *p = T->lchild;
T->lchild=T->rchild;
T->rchild=p;
}
if(T->lchild){
exchange(T->lchild);
}
if(T->rchild){
exchange(T->rchild);
}
}
十、查找二叉树是否有数据域为key的值,有的话用q指向它
void findKey(BTNode *T,BTNode *&q,int key){
if(T){
if(p->data-key){
findKet(T->lchild,q,key);
if(!q){
findKey(T->rchild,q,key);
}
}else{
p=T;
}
}
}