typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//计算一颗二叉树的所有双分支节点个数
int calNodes(BiTree b){
if(b==NULL) return 0;
if(b->lchild&&b->rchild){
return calNodes(b->lchild)+calNodes(b->rchild)+1;
}
else{
return calNodes(b->lchild)+calNodes(b->rchild);
}
}
//交换所有节点的左右子树
void swap(BiTree b){
if(b){
swap(b->lchild);
swap(b->rchild);
BiTree tmp;
tmp=b->lchild;
b->lchild=b->rchild;
b->rchild=tmp;
}
}
//查找先序序列中第k个节点的值
int cnt=0; //当前是第几个节点
int find_k(BiTree b,int k){
if(!b) return -1;
cnt++;
if(cnt==k) return b->data;
int a;
a=find_k(b->lchild,k);
if(a!=-1) return a; //在左子树中找到就不用再遍历右子树
a=find_k(b->rchild,k);
return a;
}
//删除以元素值x为根的子树。
void DeleteXTree(BiTree bt){
if(bt){
DeleteXTree(bt->lchild);
DeleteXTree(bt->rchild);
free(bt);
}
}
void Search(BiTree bt,ElemType x){
BiTree Q[];
Init Queue(Q); //创建一个装节点的队列
if(bt){
if(bt->data==x){
DeleteXTree(bt); //如果根节点为x
exit(0);
}
EnQueue(Q,bt);
while(!IsEmpty(Q)){
DeQueue(Q,p);
if(p->lchild){
if(p->lchild->data==x){
DeleteXTree(p->lchild);
p->lchild=NULL;
}
else{
EnQueue(Q,p->lchild);
}
}
if(p->rchild){
if(p->rchild->data==x){
DeleteXTree(p->rchild);
p->rchild=NULL;
}
else{
EnQueue(Q,p->rchild);
}
}
}
}
}