递归实现二叉树的深度求解:
代码解释:
//先定义两个变量,初始化为0 int ld=0,int rd=0;分别表示左子树和右子树的深度;
//先判断二叉树bt是否为空,为空直接return返回;
//不为空,进入左子树的递归调用,此时ld=1,一直到某个结点的左子树为空,if条件不成立,返回上一层递归调用;
//之后进入右子树的递归调用,再进入这个结点的左子树一直到左子树为空,返回上一层递归调用,继续进入右子树的递归调用;
//一直循环判断使用哪个递归调用;
//一直到某个结点的左右子树为空,返回ld和rd的最大值,并将所带回的值+1,重新赋给ld或者rd;
//重复上述过程,直到根结点,说明bt为空,无法继续返回,所以结束调用函数;
//返回main函数带回一个整型的值;
#include<stdio.h>
#include<stdlib.h>
typedef struct tree
{
char ch;
struct tree *lchild;
struct tree *rchild;
}BitTree;
BitTree *CreateTree() //创建树;
{
BitTree *bt;
char str;
scanf("%c",&str);
if(str=='#')
return NULL;
else
{
bt=(BitTree *)malloc(sizeof(BitTree));
bt->ch=str;
bt->lchild=CreateTree();
bt->rchild=CreateTree();
return bt;
}
}
//求二叉树的深度,递归实现;
int DeepOrder(BitTree *bt)
{
int ld=0,rd=0;
if(bt)
{
//先找到最左边的左右孩子为空的结点,之后找到相对位置靠近第一个结点的结点,依次类推;
ld=DeepOrder(bt->lchild)+1;
rd=DeepOrder(bt->rchild)+1;
}
return ld>=rd?ld:rd;
}
//释放树的结点;
void DestroyTree(BitTree *bt)
{
if(bt)
{
DestroyTree(bt->lchild);
DestroyTree(bt->rchild);
free(bt);
}
}
int main(void)
{
BitTree *bt;
printf("请以先序输入二叉树(#表示该结点的子结点为空):\n");
bt=CreateTree();
int deep=DeepOrder(bt);
printf("\n二叉树的深度为: %d\n",deep);
printf("\n");
DestroyTree(bt); //释放树结点;
return 0;
}
//代码截图: