题目:求二叉树的深度
输入一颗二叉树,求该树的深度。从根节点到叶节点依次经过的结点(含根,叶节点)形成数的一条路径,
最长路径的长度为树的深度,根节点的深度视为1
思路
二叉树有深度和高度两个属性,一个节点的深度指的是从根节点到该节点路径的长度,根节点的深度为1;一个节点的高度指的是从该节点到叶子节点所有路径上包含节点个数的最大值。叶子节点的高度为1,往上节点的高度依次递增。所以要求二叉树的深度,我们要求出从根节点到叶子结点最长路径的长度,从根节点到所有的叶子结点,实际就是在遍历这棵树。
然后,为了得到从根节点到叶子结点路径的长度,我们从根节点出发,进行深度优先遍历,当遍历到一个叶子结点时,就计算出了一条路径的长度,这时返回到上一层,即叶子结点的父亲节点,继续对另一颗子树进行深度优先遍历,计算其他路径的长度
算法实现
#include <stdio.h>
#include <malloc.h>
typedef struct BiTNode
{
char data; //结点的数据域
struct BiTNode* lchild, * rchild; //指向左孩子和右孩子
} BiTNode, * BiTree;
//创建一棵二叉树
void CreatBiTree(BiTree* T)
{
char c;
scanf("%c", &c);
if (c == '#')
*T = NULL;
else
{
*T = (BiTNode*)malloc(sizeof(BiTNode)); //创建根结点
(*T)->data = c; //向根结点中输入数据
CreatBiTree(&((*T)->lchild)); //递归地创建左子树
CreatBiTree(&((*T)->rchild)); //递归地创建右子树
}
}
//计算二叉树的深度
int getBitreeDepth(BiTree T)
{
int leftHeight, rightHeight, maxHeight;//左子树,右子树,最大深度
if (T != NULL) //如果为空树
{
leftHeight = getBitreeDepth(T->lchild);//左子树深度
rightHeight = getBitreeDepth(T->rchild);//右子树深度
maxHeight = leftHeight > rightHeight ? leftHeight : rightHeight;//最大深度
return maxHeight + 1;//二叉树深度=最大深度+1
}
else
{
return 0;
}
}
void main()
{
BiTree T = NULL; //最开始T指向空
printf("请您输入一个二叉树(以#为空子树):\n");
CreatBiTree(&T); //创建二叉树
printf("\n二叉树的深度为%d\n", getBitreeDepth(T));
}
示例
总结
该题就是二叉树的基本操作,把相关细节弄熟了就好写了。