1. 程式人生 > 實用技巧 >LeetCode111二叉樹的最小深度

LeetCode111二叉樹的最小深度

題目連結

https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/

題解一

  • 遞迴解法
  • 我寫的
  • 說明詳見註釋
// Problem: LeetCode 111
// URL: https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/
// Tags: Tree Recursion DFS
// Difficulty: Easy

#include <iostream>
using namespace std;

struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
};

class Solution{
private:
    int min=INT_MAX;

    // 深度優先遍歷,在過程中記錄最小路徑
    void dfs(TreeNode* root, int level){
        if(root==nullptr)
            return;
        level += 1;
        if(root->left==nullptr && root->right==nullptr && level < this->min)
            this->min = level;
        dfs(root->left, level);
        dfs(root->right, level);
    }

public:
    int minDepth(TreeNode* root){
        // 空樹則最小路徑為0
        if(root==nullptr)
            return 0;
        dfs(root, 0);
        return this->min;
    }
};

題解二

  • 遞迴解法
  • 參考了官方的題解
  • 說明詳見程式碼註釋,感覺有些地方比較不符合人的思維邏輯
// Problem: LeetCode 111
// URL: https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/
// Tags: Tree Recursion DFS
// Difficulty: Easy

#include <iostream>
#include <algorithm>
using namespace std;

struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
};

class Solution{
public:
    int minDepth(TreeNode* root){
        // 空樹則最小路徑為0
        if(root==nullptr)
            return 0;
        int left = minDepth(root->left);
        int right = minDepth(root->right);
        // 如果子樹中有空樹, 則該樹的最小深度等於子樹深度之和+1
        if(left==0 || right==0)
            return left+right+1;
        // 如果子樹都不為空,則該樹的最小深度等於子樹深度較小值+1
        return min(left, right)+1;
    }
};

作者:@臭鹹魚

轉載請註明出處:https://www.cnblogs.com/chouxianyu/

歡迎討論和交流!