剑指offer38:输入一棵二叉树,求该树的深度

1 题目描述

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

2 思路和方法

  深度优先搜索,每次得到左右子树当前最大路径,选择其中较大者并回溯。int len = left>right?left+1:right+1;    // 当前最大路径

3 C++ 核心代码

 1 /*
 2 struct TreeNode {
 3     int val;
 4     struct TreeNode *left;
 5     struct TreeNode *right;
 6     TreeNode(int x) :
 7             val(x), left(NULL), right(NULL) {
 8     }
 9 };*/
10 class Solution {
11 public:
12     int TreeDepth(TreeNode* pRoot){
13         if (pRoot == nullptr)
14             return 0;
15         int left = TreeDepth(pRoot->left);
16         int right = TreeDepth(pRoot->right);
17         int maxLen = left>right?left+1:right+1;    // 当前最大路径
18
19         return maxLen;
20     }
21 };

4 C++完整代码

 1 /*
 2
 3
 4 输入:
 5 第一行输入有n,n表示结点数,结点号从1到n。根结点为1。 n <= 10。
 6
 7 接下来有n行,每行有两个个整型a和b,表示第i个节点的左右孩子孩子。a为左孩子,b为右孩子。当a为-1时,没有左孩子。当b为-1时,没有右孩子。
 8
 9 输出:
10 输出一个整型,表示树的深度。
11
12 样例输入:
13 3
14 2 3
15 -1 -1
16 -1 -1
17 样例输出:
18 2
19 */
20 /*
21
22 思路: 用递归,根节点的深度等于max(左孩子的深度,右孩子的深度)。
23 */
24
25 //此题用数组存储树节点
26
27 #include<stdio.h>
28 #include<stdlib.h>
29 struct TreeNode{
30     int pLeftChild;
31     int pRightChild;
32 };
33 //递归实现
34 int depthInBTree(TreeNode* pRoot, int index){
35     if (pRoot == NULL || index == -1){//直到左右孩子时,返回0
36         return 0;
37     }
38     int leftDepth = depthInBTree(pRoot, pRoot[index].pLeftChild);
39     int rightDepth = depthInBTree(pRoot, pRoot[index].pRightChild);
40     return (leftDepth>rightDepth ? leftDepth : rightDepth) + 1;
41 }
42 int main(void){
43     int n;
44     while (scanf("%d", &n) != EOF&&n>0 && n <= 10){
45         TreeNode *pRoot = (TreeNode *)malloc(n*sizeof(TreeNode));
46         if (pRoot == NULL){
47             exit(EXIT_FAILURE);
48
49         }
50         for (int i = 0; i<n; i++){
51             int leftIndex;
52             int rightIndex;
53             scanf("%d%d", &leftIndex, &rightIndex);
54             if (leftIndex != -1){
55                 pRoot[i].pLeftChild = leftIndex - 1;
56             }
57             else{
58                 pRoot[i].pLeftChild = -1;
59             }
60             if (rightIndex != -1){
61                 pRoot[i].pRightChild = rightIndex - 1;
62             }
63             else{
64                 pRoot[i].pRightChild = -1;
65             }
66         }
67
68         int depth = depthInBTree(pRoot, 0);
69         printf("%d\n", depth);
70
71     }
72
73     system("pause");
74     return 0;
75 }

参考资料

https://blog.csdn.net/libin1105/article/details/48395021

原文地址:https://www.cnblogs.com/wxwhnu/p/11421376.html

时间: 2024-07-31 21:44:24

剑指offer38:输入一棵二叉树,求该树的深度的相关文章

编程实现求一棵二叉树的最短树路径和最长树路径

Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node. class Solution { public: int minDepth(TreeNode *root) { if(!r

28、输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路:  1.当Tree1和Tree2都不为零的时候,才进行比较.否则直接返回false  2. 2.1如果找到了对应Tree2的根节点的点, 以这个根节点为为起点判断是否包含Tree2 2.2 如果找不到,那么就再去root的左孩子当作起点,去判断时候包含Tree22.3 如果还找不到,那么就再去root的右孩子当作起点,去判断时候包含Tree2 1 public class Solution

剑指Offer:对称的二叉树【28】

剑指Offer:对称的二叉树[28] 题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 题目分析 Java题解 /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution {

剑指Offer-38.平衡二叉树(C++/Java)

题目: 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 分析: 可以从根节点开始遍历每一个节点,求得节点左右子树的最大高度,判断是不是平衡二叉树.这样做的问题在于会重复遍历节点,造成不必要的浪费. 所以可以采用后续遍历来求解此题,判断子树是否是平衡二叉树,如果是,就返回子树的最大高度,不是的话,就中止遍历,这样做的话每个节点只访问一遍. 程序: C++ class Solution { public: bool IsBalanced_Solution(TreeNode* pRoot) { if(

剑指Offer对答如流系列 - 序列化二叉树

面试题37:序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树. 树的结构定义如下: public class Node { int val = 0; Node left = null; Node right = null; public Node(int val) { this.val = val; } } 问题分析 一般情况下,需要采用前/后序遍历和中序遍历才能确定一个二叉树,具体的内容我们之前探讨过 剑指Offer对答如流系列 - 重建二叉树 但是采用这种方式进行序列化

【剑指offer】十七,二叉树中和为某一值的路径

题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 分析:队树的节点值得求和之类的操作大部分都是基于树的遍历操作的,只要对树的遍历操作稍作变形,基本都能解决问题(个人观点).我们知道只有树的先序遍历是首先访问根节点的,此题的关键在于如何把树遍历过程中的节点保存下来,把满足条件的路径加入到结果中,不满足条件的路径节点如何进行重新的搜索.当用前序遍历的方式访问到某一节点时,我们把该节点添加到路径上,并

浅谈《剑指offer》原题:求1+2+……+n

<剑指offer>上的一道原题,求1+2+--+n,要求不能使用乘除法,for.while.if.else.switch.case等关键字以及条件判断语句(a?b:c). 第一次看到这道题大约有一年的时间了,在霸笔网易的时候,当时我就晕了...心想这是神马东西,后来发现这是原题!!然后后悔自己没看过书了... <剑指offer>上给出了不错的解法,但是这里有个解法更巧妙,虽然技术含量不高,但是可以参考,这就是<程序员面试笔试宝典>中所给出的答案. 解法一:利用宏定义求解

剑指offer系列源码-二叉树中和为某一值的路径

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. #include <iostream> #include<stdio.h> #include<vector> using namespace std; struct BinaryTreeNode{ int value; BinaryTreeNode* left; BinaryTreeNode* right; }; //递归判断路劲

《剑指offer》:[62]序列化二叉树

题目:请实现两个函数,分别来序列化和反序列化二叉树. 方案分析:我们知道通过二叉树的中序和任何一个前或者后续遍历都可以反序列化一棵二叉树,但是这样做有一个缺点就是,序列化的数据不能有重复的数据,否则会出错.另外,在反序列化时,需要知道中序和另外的任意一种序列才行,如果两课二叉树在字符流里读出,且二叉树的数据比较多,则会相当的耗时.所以,这里我们采取前序遍历来完成序列化和反序列化,因为我们都知道用前序遍历创建过二叉树.只不过这里如果一旦遇到NULL结点,我们需要用其他的字符来代替它.这样在反序列化