1. 程式人生 > >二叉樹最小深度問題

二叉樹最小深度問題

【問題描述】:
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