Leetcode 98 驗證二叉樹

2021-10-24 09:37:21 字數 2222 閱讀 2346

採用遞迴的方式,判斷左節點小於根,右節點大於根。

結果:錯誤。

錯誤案例為:

原因:右孩子的左孩子(右孫子)可能小於父親。 6 < 10,出錯。

想到的解決方案:在遞迴過程中吧祖先記錄下來,用以後續的比較。

在遞迴過程中加入祖先,並且加入 bool 標識指示是左孩子還是右孩子。

public

class

solution1

public

boolean

isvalid

(treenode root, arraylist

parents,

boolean isright)

arraylist

clone =

(arraylist

)parents.

clone()

; clone.

add(root)

; left =

isvalid

(root.left, clone,

false);

right =

isvalid

(root.right, clone,

true);

return left && right;

}}

再次出錯,出錯案例為:

出錯原因:曾孫子,曾曾孫子都有可能出錯。上述為 根為 1 的左右標記覆蓋了根為 3 的左右標記,導致 最下面的 3 無法被判誤。

解決方法:標記去除,換為上下界,每次迭代按收窄趨勢更新上下界。因此有了想法 3。

public

class

solution1

public

boolean

isvalid

(treenode root,

int min,

int max)

}

**大大減少,並且能夠覆蓋上述的情況。

但出現了邊界問題,當節點的值為min或者max時,會直接判斷錯誤。

但是,存在一些min,max為正確的案例。

無法解決。。。

看答案。。。

查閱答案後發現,把邊界的型別改為long即可

public

class

solution1

public

boolean

isvalid

(treenode root, long min, long max)

}

在答案中還看到了另外一種思路:原文

採用中序遍歷二叉樹,獲得的值按公升序,即表示為合格的 bst。

public

class

solution2

// 訪問左子樹if(

!isvalidbst

(root.left)

)// 訪問當前節點:如果當前節點小於等於中序遍歷的前乙個節點,說明不滿足bst,返回 false;否則繼續遍歷。

if(root.val <= pre)

pre = root.val;

// 訪問右子樹

return

isvalidbst

(root.right);}

}

與上述方法相同的思路,有以下的寫法:

public

class

solution3if(

isvalidbst

(root.left))}

return

false;}

}

推薦採用第一種,原因是:

對於乙個 bst 的否定,是分離的 false statement。但對於它的肯定,則需要串聯的 true statement。

因此進行否定的難度較小。

leetcode 98 驗證二叉搜尋樹(二叉樹)

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 示例 1 輸入 2 1 3 輸出 true示例 2 輸入 5 1 4 3 6 輸出 false 解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 二叉搜尋樹數的中序遍歷序列...

二叉樹 LeetCode 98 驗證二叉搜尋樹

題面 給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例1 輸入 2 13輸出 true例項2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...

leetcode 98 驗證二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。乙個二叉搜尋樹具有如下特徵 示例 1 輸入 1 3 輸出 true 示例 2 輸入 1 4 3 6 輸出 false 解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 關鍵資訊 1二叉搜尋樹的中序遍歷是遞...