1.判断两棵二叉树是否相似(不考虑节点数据)
int Similar(BiTree T1,BiTree T2){
int left,right;
if(T1==NULL&&T2==NULL){
return 1; //均为空树 相似
}else if(T1==NULL||T2==NULL){
return 0; //一棵为空一棵不为空,不相似
}else { //均不为空树
left=Similar(T1->lchild,T2->lchild);
right=Similar(T1->rchild,T2->rchild);
return left&&right; //left和right均为1时(两棵树相似)返回1
}
}
2.删除二叉树中 根结点 值为x 的子树
1)查找节点为x的节点
2)删除以该节点为根的子树
//删除根节点为x的子树
int DeleteTree(BiTree T){
if(T!=NULL){
DeleteTree(T->lchild);
DeleteTree(T->rchild);
free(T);
}
}
void Search(BiTree &T,ElemType x){ //查找节点值为x的节点
if(T==NULL){
return;//树为空
}
if(T-data==x){ //根节点为x,删除整棵树
DeleteTree(T);
return;
}
Queue Q;
InitQueue(Q);
BiTree *p=T;
EnQueue(Q,p);
while(Q!=NULL){
DeQueue(Q,p);
}
if(p->lchild==x) {//若左孩子等于x,删除此子树
DeleteTree(p);
}else
if(p->rchild==x){
DeleteTree(P);
}else{ //左右子树都不为x,继续遍历查找
Search(p->lchild,x);
Search(p->rchild,x);
}
}
3.非递归求二叉树的深度
int DeepTree(BiTree T){
if(T==NULL){
return 0;
}
int h=0,last=0;
BiTree *Q[MaxSize];
int front=-1,rear=-1;
BiTree *p=T;
rear++;
Q(rear)=p; //根节点入队 也可写为Q(++rear)=p;
while(front<rear){ //队不为空
front++; //元素出队,每出队一个元素 front指针后移一位
p=Q[front];
if(p->lchild){
rear++;
Q[rear]=p->child;
}
if(p->rchild){
rear++;
Q[rear]=p-rchild;
}
if(front==last){ //front等于每一层最后一个节点时,高度增加
h++;
last=rear; //last指向尾指针(重新指向下一层最后一个节点)
}
}
return h;
}