题目一
编写递归算法,求二叉树中以元素值为x的结点为根的子树的深度
思想
先递归找出x的位置,用p指向,然后找到子树的深度(求树的深度的思路:
1、如果树为空,则深度为0
2、如果树不是空,那么深度是左子树的深度+1或右子树的深度+1)
代码
int T644(BiTree *T,TElemType x)
{
BiTree p;
p=locationBiTree(T,x); //第一个递归找出x的位置,用p指向
return BiTreedepth(p); //返回p的深度
}
BiTree locationBiTree(BiTree *T,TElemType x){
if(T){
if(T->data==x){
return T;
}
else{
locationBiTree(T->lchild,x);
locationBiTree(T->rchild,x);
}
}
return NULL;
}
int BiTreedepth(BiTree p){
int n1,n2;
if(p==NULL)
return 0;
else{
n1=BiTreedepth(p->lchild);
n2=BiTreedepth(p->rchild);
if(n1>n2)
return n1+1;
else
return n2+1;
}
}
题目二
对于二叉树中每一个元素值为x的结点,删除以它为跟的子树,并释放相应的空间
思路
代码
void T645(BiTree *T,ElemType x)
{
if(*T)
{
if((*T)->data=x)
ClearBiTree(T);
else
{
T645(&(*T)->lchild,x);
T645(&(*T)->rchild,x);
}
}
}
题目三
层次顺序遍历二叉树
思想
首先根结点入队,然后循环,有左节点则左节点入队,有右节点则右节点入队;j标识队列,i标识循环次数
代码
void T647(BiTree T)
{
int i,j;
BiTree p[100]; //数组模拟队列
i=j=0;
if(T)
p[j++]=T; //根结点入队
while(i<j)
{
printf("%c",p[i]->data);
if(p[i]->lchild)
p[j++]=p[i]->lchild; //左节点入队
if(p[i]->rchild)
p[j++]=p[i]->rchild; //右节点入队
i++;
}
}