二叉樹最小深度問題
阿新 • • 發佈:2019-01-05
【問題描述】:
Given a binary tree, find its minimum depth.The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.
給定一個二叉樹,求出它的最小深度,最小深度是從根節點到最近的葉子節點的最短路徑的節點數。
【思路】:遍歷一棵二叉樹,從根部看起,檢視它是否有左右結點。有五種情況
1.沒有根節點,那結果就是0
2.有根節點,沒有左右子樹,結果為1
3.沒有左子樹,有右子樹。把右子樹看成一棵新的樹。
4.沒有右子樹,有左子樹。把左子樹看成一棵新的樹。
5.既有左子樹,又有右子樹。那就把左右子樹分別都看成新的樹,最後比較誰的最近葉子的路徑短,就取哪邊。
因為都把左右子樹看成新的樹了,所以每一棵樹都可以用2-3-4-5來判斷找出最近葉子的最短路徑。
每一棵樹都呼叫這個判斷的方法,所以就是遞迴
【考察】:樹的深度優先遍歷結合遞迴的使用
// c/c++
class Solution {
public:
int run(TreeNode *root) {
if(root==NULL)return 0;//樹為空
if(root->left==NULL && root->right==NULL)return 1;//無左右子樹
if(root->left==NULL)return run(root->right)+1;
//無左子樹,以右子樹為根,看它的左右子樹
else if(root->right==NULL )return run(root->left)+1;//同上
else return 1+min(run(root->left),run(root->right));
}
};
方法2:
// c/c++
//把二叉樹的左右子樹都分離出來,作為一棵新的樹,呼叫run方法
class Solution{
public:
int run(TreeNode *root){
if(!root)return 0;
int l=run(root->left);
int r=run(root->right);
if(l==0||r==0){
return 1+r+l;
}
else return 1+min(l,r);
}
}
【總結】:對比了兩種方法,都是用了遞迴和深度優先搜尋,但是第二種方法程式碼比較簡潔,執行時間比第一種少了10ms.但其實佔用記憶體都一樣,是8816k