想要计算一个二叉树的深度,我们先可以拆成求根结点的左右子树的深度;而根结点的左右子树的深度又可拆成求根左结点的左右子树深度和根右结点的左右子树的深度。这样一层一层给套下去,很容易想到递归。
- 明确每一步重复的任务:
计算节点左右子树的深度,并取其最大值。 - 确认递归的形参和返回值:
形参肯定为某节点的地址,不然算谁的子树高度呢!
返回值当然为当前子树的最大深度。这里注意,我们算出了节点的左右子树深度的最大值时,还需加1作为返回值,因为节点本身也是一层。
- 确认递归结束条件:
当节点为空时,递归结束。
二叉树结点定义:
typedef struct BinaryTreeNode{
int data;
struct BinaryTreeNode *lchild, *rchild;//左右孩子指针
}BinaryTreeNode, *pBinaryTreeNode;
计算树的最大深度:
int GetTreeHeight(pBinaryTreeNode node)
{
if (node == nullptr)
return 0;
int leftDeep = GetTreeHeight(node->lchild);//找左子树的最大深度
int rightDeep = GetTreeHeight(node->rchild);//找右子树的最大深度
return leftDeep > rightDeep ? leftDeep + 1 : rightDeep + 1;
}
完整代码及测试:
#include <iostream>
using namespace std;
//二叉树节点定义
typedef struct BinaryTreeNode{
int data;
struct BinaryTreeNode *lchild, *rchild;//左右孩子指针
}BinaryTreeNode, *pBinaryTreeNode;
int GetTreeHeight(pBinaryTreeNode node)
{
if (node == nullptr)
return 0;
int leftDeep = GetTreeHeight(node->lchild);//找左子树的最大深度
int rightDeep = GetTreeHeight(node->rchild);//找右子树的最大深度
return leftDeep > rightDeep ? leftDeep + 1 : rightDeep + 1;
}
int main()
{
//静态生成一颗二叉树
BinaryTreeNode node[8];
for (int i = 0; i < 8; i++){
node[i].lchild = nullptr;
node[i].rchild = nullptr;
}
node[0].data = 3;
node[1].data = 9;
node[2].data = 20;
node[3].data = 15;
node[4].data = 7;
node[5].data = 0;
node[6].data = 4;
node[7].data = 1;
node[0].lchild = &node[1];
node[0].rchild = &node[2];
node[1].lchild = &node[3];
node[1].rchild = &node[4];
node[2].rchild = &node[5];
node[3].rchild = &node[6];
node[4].rchild = &node[7];
//计算树的深度
cout << GetTreeHeight(&node[0]) << endl;
system("pause");
return 0;
}
注意:代码中静态生成的二叉树如下图所示。若想用户从键盘输入二叉树的结点数据,可以参考
:递归创建二叉树(C版)
测试结果:
递归过程解释:假设我们已经运行到了结点15。
1.运行->int leftDeep = GetTreeHeight(node->lchild);
由于15结点无左子树,所以调用函数后会return 0,可得到结点15的leftDeep = 0
2.运行->int rightDeep = GetTreeHeight(node->rchild);
由于15结点有右结点4,所以继续调用这两个函数,
2.1运行->int leftDeep = GetTreeHeight(node->lchild);
2.2运行->int rightDeep = GetTreeHeight(node->rchild);
由于结点4无左右子节点,所以上面两个函数都是return 0,接着
2.3运行-return leftDeep > rightDeep ? leftDeep + 1 : rightDeep + 1;
4结点的左右子树的深度都为0,所以返回给上一层(也就是结点15)的深度为1,可得到结点15的rightDeep = 1
3.运行->return leftDeep > rightDeep ? leftDeep + 1 : rightDeep + 1;
运行到这里,结点15的左右子树的深度已经计算出来了:leftDeep = 0,rightDeep = 1,返回时,就是返回结点15这颗子树的深度了,即2。