日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 二叉树、N叉树的最大深度与最小深度(递归解)

發布時間:2023/12/1 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 二叉树、N叉树的最大深度与最小深度(递归解) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

    • 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);} };

總結

以上是生活随笔為你收集整理的LeetCode 二叉树、N叉树的最大深度与最小深度(递归解)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。