九度OJ-题目1350:二叉树的深度

题目链接地址:

九度OJ-题目1350:二叉树的深度


题目描述:
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

输入:
第一行输入有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
****************************************************************/

猜你喜欢

转载自blog.csdn.net/pengyan0812/article/details/46454371