RT
思路
- 遞迴, 左子樹和右子樹的高度比較大的那一個加1,就得到樹的最大高度
- 第二種當時怎麼寫的我自己也弄不清楚了,也是遞迴。。。
Solution 1
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxDepth(TreeNode *root) {
if(root!=nullptr){
int left_h = maxDepth(root->left); //左子樹高度
int right_h = maxDepth(root->right); //右子樹高度
int max_h = left_h>right_h?left_h:right_h;
return max_h+1;
//寫成這樣就會超時了,時間複雜度從 O(2^n) -> O(4^n)
//return maxDepth(root->left)>maxDepth(root->right)?maxDepth(root->left)+1:maxDepth(root->right)+1;
}else{
return 0;
}
}
};
Solution 2
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
Solution(){depth=0;lastDepth=0;}
int depth; //應該為private
int lastDepth; //應該為private
int maxDepth(TreeNode *root) {
if(root!=nullptr){
depth++; //到達新的節點,深度+1
//dep當前層的深度,先儲存一下,便於從左子樹回來或者右子樹回來的時候直接將depth置為dep
int dep=depth;
//遍歷左子樹,更新depth為往左子樹走能達到的深度
maxDepth(root->left);
//走到深度更深的位置,替換
if(depth>lastDepth){
lastDepth = depth;
}
//如果從左子樹回溯回來,要將depth-- ,回到depth
if(root->left){
//這兩句是一樣的, 左子樹回來的時候depth-1即可,但是右子樹回來的時候就要利用到dep了。
depth--;
//depth = dep;
}
//看右子樹的深度
maxDepth(root->right);
//從右子樹回來,depth回到當前層的深度
if(root->right){
depth = dep;
}
}
return lastDepth;
}
};