題目描述
給定一個非空特殊的二叉樹,每個節點都是正數,並且每個節點的子節點數量只能爲 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;
}
}
}