Maximum Depth of Binary Tree

第一反应是用按层次遍历,用队列做。

看了别人的代码才想起来也可以用递归去做。就是比较根的左右子树的深度,深度大的那个再加一就是根的深度了。

递归:

 1 /**
 2  * Definition for binary tree
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     int maxDepth(TreeNode *root) {
13         if(!root)
14         {
15             return 0;
16         }
17         else
18         {
19             int leftDepth,rightDepth;
20             leftDepth=maxDepth(root->left);
21             rightDepth=maxDepth(root->right);
22             return 1+(leftDepth>rightDepth?leftDepth:rightDepth);
23         }
24     }
25 };

 更简洁的写法:

1 int maxDepth(TreeNode *root) {
2         if(!root)
3             return 0;
4         else
5             return 1+max(maxDepth(root->left),maxDepth(root->right));
6     }

按层次遍历用队列实现,不过这道题是计算树的深度,那就需要知道每一层什么时候遍历完的,这个怎么做呢?需要另外设置一个变量记录每一层结点的个数。

具体的就想不通了,参看http://blog.csdn.net/ithomer/article/details/8799795

 1 /**
 2  * Definition for binary tree
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10  
11  /*
12 STL 中队列的使用(queue)
13 #include <queue>
14 
15 基本操作:
16 push(x) 将x压入队列的末端
17 pop() 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值
18 front() 返回第一个元素(队顶元素)
19 back() 返回最后被压入的元素(队尾元素)
20 empty() 当队列为空时,返回true
21 size() 返回队列的长度
22  */
23 class Solution {
24 public:
25     int maxDepth(TreeNode *root) {
26         if(!root)
27         {
28             return 0;
29         }
30         else
31         {
32             queue<TreeNode *> Q;
33             //queue<TreeNode> Q;
34             Q.push(root);
35             TreeNode *p;
36             //int depth;//树的深度   Input:    {0} Output:    162865233 Expected:    1
37             int depth=0;
38             int count=1;//记录每一层结点的个数
39             while(!Q.empty())
40             {
41                 p=Q.front();
42                 Q.pop();
43                 count--;
44                 
45                 if(p->left)
46                 {
47                     Q.push(p->left);
48                 }
49                 if(p->right)
50                 {
51                     Q.push(p->right);
52                 }
53                 if(count==0)
54                 {
55                     depth++;
56                     count=Q.size();//下一层的结点个数
57                 }
58             }
59             return depth;
60         }
61     }
62 };

36行那里不明白,为什么我没有给depth初始化,结果就错了,C++中int类型不是默认初始化为0么。呃,好吧,刚才在codeblocks中试了一下,果然是我记错了。

《C++ primer》第四版第65页中写道:

variable initialization(变量初始化) 描述当没有给出显式初始化变量或数组元素的规则的术语。

对类类型来说,通过运行类的默认构造函数来初始化对象。如果没有默认构造函数,那么将出现编译时错误:必须要给对象指定显式的初始化式。

对于内置类型来说,初始化取决于作用域。定义在全局作用域的对象初始化为0,而定义在局部作用域的对象则未初始化,拥有未定义值。

原文地址:https://www.cnblogs.com/crane-practice/p/3587236.html