111. 二叉樹的最小深度(C++)
阿新 • • 發佈:2020-09-09
目錄
題目
給定一個二叉樹,找出其最小深度。
最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。
說明: 葉子節點是指沒有子節點的節點。
示例:
給定二叉樹 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最小深度 2.
分析與題解
本體與二叉樹的最大深度
類似,一個是計算左右葉子結點的max
,一個是min
。但需要注意的是,在遞迴函式中,對於空結點,我們都返回0,當求取最大深度使用max
函式時,非空結點肯定比空結點的返回值大。但在求取最小深度min
函式時,一般空結點會求得相對更小的值,因此這裡不能簡單的使用min
max
函式,而需要對是否為空結點進行一個判斷。
自底向上
自定義一個將深度作為形參的函式,每次遞迴呼叫,作為形參傳入的深度就會加一。程式碼如下:
/** * 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 getMinDepth(TreeNode* root, int depth){ if(root==nullptr) return 0; int left = getMinDepth(root->left, depth+1); int right = getMinDepth(root->right, depth+1); if(root->left==nullptr && root->right==nullptr) return depth; else if(root->left==nullptr) return right; else if(root->right==nullptr) return left; else return min(left,right); } int minDepth(TreeNode* root) { int depth=1; return getMinDepth(root, depth); } };
自頂向下
不將深度作為形參,在函式中層層迭代逐漸累加求得深度大小,程式碼如下:
/** * 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 minDepth(TreeNode* root) { if(root==nullptr) return 0; int left = minDepth(root->left); int right = minDepth(root->right); //比較前要排除某個子節點是空的情況 //因為max的話肯定比空結點的0大 if(root->left==nullptr) return right+1; else if(root->right==nullptr) return left+1; else return min(right,left)+1; } };