(Java)leetcode-671 Second Minimum Node In a Binary Tree(二叉樹中第二小的節點)

題目描述

給定一個非空特殊的二叉樹,每個節點都是正數,並且每個節點的子節點數量只能爲 2 或 0。如果一個節點有兩個子節點的話,那麼這個節點的值不大於它的子節點的值。

給出這樣的一個二叉樹,你需要輸出所有節點中的第二小的值。如果第二小的值不存在的話,輸出 -1 。

在這裏插入圖片描述

思路

題目的用例還不夠完整,自己補充一個:

    2
   / \
  4   2
     / \
    3   5

這種情況下,如果根節點的子節點,與根節點的值相同,那麼還需要往下查找。(例如4並不一定是第二小的)
思路直接寫在代碼裏了。

代碼

 class Solution {
    public int findSecondMinimumValue(TreeNode root) {
        if(root == null || root.left == null ) return -1;//沒有最小節點

        //找出候選數,默認就是子節點值,如果子節點值和root值相同,遞歸,在子樹中尋找候選數
        int left = root.left.val;
        int right = root.right.val;
        if(root.left.val == root.val) left = findSecondMinimumValue(root.left);
        if(root.right.val == root.val) right = findSecondMinimumValue(root.right);

        //如果左右候選數都正常,返回較小值就可
        if(left != -1 && right != -1){
            return Math.min(left, right);
        }
        //如果候選數有-1,說明整個子樹中沒有可供候選的數
        if(left != -1){
            //左子樹正常,答案就是左邊的候選數
            return left;
        }else{
            //右子樹正常,返回答案
            //或者右子樹也沒有候選數,返回-1,即right
            return right;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章