目錄
- 104. 二叉樹的最大深度
- 559. N叉樹的最大深度
- 111. 二叉樹的最小深度
之前的筆記中,已經用層序遍歷解決過這個問題了
現在試著用深度的解法去求解
104. 二叉樹的最大深度
給定一個二叉樹,找出其最大深度。
二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。
說明: 葉子節點是指沒有子節點的節點。
示例:
給定二叉樹 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回它的最大深度 3 。
**選擇深度遍歷方式:**由于我們需要返回深度信息,所以選擇后序遍歷,通過遞歸函數的返回值做計算樹的高度。
1、確定遞歸函數的參數以及返回值類型
輸入樹的根結點,返回這棵樹的深度
int getDepth(TreeNode* node)
2、確定終止條件:
如果為空結點,返回高度0
if(node == NULL) return 0;
3、確定單層邏輯:
先求左子樹深度,再求右子樹的深度,最后取左右深度最大的數值+1(算上當前的中間結點),就是當前結點為根節點的樹的最大深度。
int left=getDepth(node->left);
int right=getDepth(node->right);
return max(left,right)+1
完整代碼
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:int getDepth(TreeNode* node){if(node == NULL) return 0;int left=getDepth(node->left);int right=getDepth(node->right);return max(left,right)+1;}int maxDepth(TreeNode* root) {int result=getDepth(root);return result;}
};
上面的方法使用的是后序遍歷求根結點的高度來求二叉樹的最大深度。
當然也可以使用前序遍歷,更能體現出回溯的思想:
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:int result;void getDepth(TreeNode* node,int depth){//中result = depth > result ? depth:result; //取結果與depth中的較大值。if(node->left ==NULL && node->right ==NULL) return ;//左if(node->left){depth++; //深度+1getDepth(node->left,depth);depth--; //回溯,深度-1}//右if(node->right){depth++; //深度+1getDepth(node->right,depth);depth--; //回溯,深度-1}return ;}int maxDepth(TreeNode* root) {result = 0;if(root == NULL) return result;getDepth(root,1);return result;}
};
559. N叉樹的最大深度
給定一個 N 叉樹,找到其最大深度。
最大深度是指從根節點到最遠葉子節點的最長路徑上的節點總數。
例如,給定一個 3叉樹 :
/*
// Definition for a Node.
class Node {
public:int val;vector<Node*> children;Node() {}Node(int _val) {val = _val;}Node(int _val, vector<Node*> _children) {val = _val;children = _children;}
};
*/class Solution {
public:int getDepth(Node* node){if(node == NULL) return 0;int maxnum=0;for(int i=0;i<node->children.size();i++){maxnum=max(maxnum,getDepth(node->children[i]));}return maxnum+1;}int maxDepth(Node* root) {int result=getDepth(root);return result;}
};
111. 二叉樹的最小深度
給定一個二叉樹,找出其最小深度。
最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。
說明: 葉子節點是指沒有子節點的節點。
示例:
給定二叉樹 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回它的最小深度 2.
**選擇深度遍歷方式:**由于我們需要返回深度信息,所以選擇后序遍歷,通過遞歸函數的返回值做計算樹的高度。
1、確定遞歸函數的參數以及返回值類型
輸入樹的根結點,返回這棵樹的深度
int getDepth(TreeNode* node)
2、確定終止條件:
如果該結點的左右孩子都為空,返回 0
if(node==NULL) return 0;
3、確定單層邏輯:
如果左子樹存在,右子樹不存在,結果為左子樹最小深度+1
如果右子樹存在,左子樹不存在,結果為右子樹最小深度+1
如果兩個子樹都存在,選擇最小的結果+1
如果兩個孩子都不存在的話,進入下一個遞歸地時候會返回0,兩個結果都是1,所以這里不需要考慮那樣的情況
int leftDepth=getDepth(node->left);
int rightDepth=getDepth(node->right);
if(node->left && !node->right) return leftDepth+1;
if(!node->left && node->right) return rightDepth+1;
int result=1+min(rightDepth,leftDepth);
return result;
完整代碼
class Solution {
public:int minDepth(TreeNode* root) {if(root==NULL) return 0;int leftDepth=minDepth(root->left);int rightDepth=minDepth(root->right);if(root->left && !root->right) return leftDepth+1;if(!root->left && root->right) return rightDepth+1;return 1+min(rightDepth,leftDepth);}
};