四、树
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
1、计算二叉树中所有结点的个数
注意count的位置
法一:
int count=0;
void countNode(BiTree T){
if(T!=NULL){
count++;
countNode(T->lchild);
countNode(T->rchild);
}
}
法二:
int countNode(BiTree T){
int count=0;
if(T==NULL)
return 0;
else
return countNode(T-lchild)+countNode(T->rchild)+1;
}
二、计算二叉树中所有叶子结点的个数
int count=0;
void countLeaf(BiTree T){
if(T!=NULL){
countLeaf(T->lchild);
countLeaf(T->rchild);
if(T->lchild==NULL && T->rchild==NULL)
count++;
}
}
三、计算二叉树结点中所有双分支结点的个数
int count=0;
void doubleLeaf(BiTree T){
if(T!=NULL){
if(T->lchild && T->rchild)
count++;
doubleLeaf(T->lchild);
doubleLeaf(T->rchild);
}
}
四、计算二叉树的深度
int Depth(BiTree T){
if(T==NULL)
return 0;
else{
int l=Depth(T->lchild);
int r=Depth(T->rchild);
return l>r ? l+1:r+1;
}
}
五、(a-(b+c))*(d/e)存储在二叉树,遍历求值
算出左子树的值,算出右子树的值,最终将两值进行运算
//基本运算
int biscomp(int a,int b,char opr){
switch(opr){
case '+':
return a+b;
case '-':
return a-b;
case '*':
return a*b;
case '/':
return a/b;
}
}
//算出左子树的值,算出右子树的值,进行运算
int compute(BiTree T){
int a,b;
if(T==NULL)
return 0;
else{
if(T->lchild && T->rchild){
a=compute(T->lchild);
b=compute(T->rchild);
return biscomp(a,b,T);
}
else{
return T->data;
}
}
}
六、找出二叉树中最大的点
找出右子树最大的值,找出左子树最大的值,将两值进行比较,选出最大值与根进行比较
int MaxNode(BiTree T){
int max,maxroot,maxl,maxr;
if(T){
maxroot = T->data;
maxl=MaxNode(T->lchild);
maxr=MaxNode(T->rchild);
if(maxl>maxr)
max=maxl;
else
max=maxr;
if(max < maxroot)
max=maxroot;
}
else{
return 0;
}
return max;
}
七、判断两个二叉树是否相似
若T1和T2都是空树,则两树相似,若一个为空一个不为空,则必然不相似。
int Similar(BiTree T1,BiTree T2){
int l,r;
if(T1==NULL&&T2==NULL)
return 1;
else if(T1==NULL||T2==NULL)
return 0;
else{
l=Similar(T1->lchild,T2->lchild);
r=Similar(T1->rchild,T2->rchild);
return l&&r;
}
}
八、把二叉树所有结点子树交换
交换左子树的结点,交换右子树的结点,交换左右子树的结点
void swap(BiTree T){
BiTree temp;
if(T){
swap(T->lchild);
swap(T->rchild);
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
}
}
九、查找二叉树中data域等于key的结点是否存在
BiNode* findNode(BiTree T,int key){
BiNode *p;
if(T==NULL)
return NULL;
else{
if(T->data==key)
return T;
//判断左子树中是否有key
p=findNode(T->lchild,key);
if(p)
return p;
//判断右子树中是否有key
p=findNode(T->rchild,key);
if(p)
return p;
}
return NULL;
}
十、输出先序遍历第k个结点的值
设置一个变量p记录每遍历一个结点的次数,找到当p为k时的那个结点,输出该结点的值
int p=1;//记录次数
ElemType PreNode(BiTree T,int k){
ElemType ch;
if(T==NULL)
return '#';
if(p==k)
return T->data;
p++;
ch=PreNode(T->lchild,k);
if(ch !='#')
return ch;
ch=PreNode(T->lchild,k);
return ch;
}