题目链接地址:
题目描述:
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
输入:
第一行输入有n,n表示结点数,结点号从1到n。根结点为1。 n <= 10。
接下来有n行,每行有两个个整型a和b,表示第i个节点的左右孩子孩子。a为左孩子,b为右孩子。当a为-1时,没有左孩子。当b为-1时,没有右孩子。
输出:
输出一个整型,表示树的深度。
样例输入:
3
2 3
-1 -1
-1 -1
样例输出:
2
解题思路:
二叉树是一种递归的数据结构,也就是说如果某个结点存在子树,那么该子树也是二叉树。二叉树的深度定义是:从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
因此获取到根结点的左右子树的深度,取二者的较大值加1就是该二叉树的深度,而通过递归就可以求出根结点的左右子树的深度。
AC代码如下:
#include<stdio.h>
#define MAX 11
typedef struct Node
{
bool isRoot; // 标记结点是否为根结点
Node * lChild; // 左孩子
Node * rChild; // 右孩子
}BinaryTreeNode;
BinaryTreeNode binaryTreeNode[MAX];
/**
* 初始化二叉树中的结点,将每个结点都看成是一棵只含有根结点,无孩子结点的二叉树
* @param n 二叉树的结点数目
* @return void
*/
void initBinaryTree(int n)
{
int i;
for(i = 1;i <= n;i++)
{
binaryTreeNode[i].isRoot = true;
binaryTreeNode[i].lChild = NULL;
binaryTreeNode[i].rChild = NULL;
}
}
/**
* 构造有n个结点的二叉树
* @param n 二叉树的结点个数
* @return root 返回二叉树的根结点
*/
BinaryTreeNode * createBinaryTree(int n)
{
BinaryTreeNode * root = NULL;
int i;
int leftChild,rightChild;
initBinaryTree(MAX);
// 构造各个二叉树结点的左右孩子,结点编号从1开始
for(i = 1;i <= n;i++)
{
scanf("%d%d",&leftChild,&rightChild);
if(leftChild != -1)
{
binaryTreeNode[i].lChild = &binaryTreeNode[leftChild];
binaryTreeNode[leftChild].isRoot = false;
}
if(rightChild != -1)
{
binaryTreeNode[i].rChild = &binaryTreeNode[rightChild];
binaryTreeNode[rightChild].isRoot = false;
}
}
// 找到二叉树的根结点
for(i = 1;i <= n;i++)
{
if(true == binaryTreeNode[i].isRoot)
{
root = &binaryTreeNode[i];
break;
}
}
return root;
}
/**
* 获取二叉树的高度
* @param root 二叉树的根结点
* @return h 返回二叉树的高度
*/
int getBinaryTreeHeight(BinaryTreeNode * root)
{
int hl,hr,h;
if(NULL == root)
return 0;
else // 通过递归获取左右子树的高度,取二者的较大值加1做为二叉树的高度
{
hl = getBinaryTreeHeight(root -> lChild) + 1;
hr = getBinaryTreeHeight(root -> rChild) + 1;
h = hl > hr ? hl : hr;
return h;
}
}
int main()
{
int n;
int biTreeHeight;
BinaryTreeNode * root;
scanf("%d",&n);
root = createBinaryTree(n);
biTreeHeight = getBinaryTreeHeight(root);
printf("%d\n",biTreeHeight);
return 0;
}
/**************************************************************
Problem: 1350
User: blueshell
Language: C++
Result: Accepted
Time:0 ms
Memory:1020 kb
****************************************************************/