驗證二叉搜尋樹java版

2021-08-30 15:37:34 字數 1410 閱讀 4911

題目

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。

假設乙個二叉搜尋樹具有如下特徵:

輸入:

2/ \ 1

3輸出:true

示例2:

輸入:

5/ \ 1

4/ \

36輸出:false

解釋:輸入為:[5

,1,4

,null,null,3,

6]。根節點的值為 5 ,但是其右子節點值為 4 。

輸出: false

解釋:輸入為: [5,1,4,null,null,3,6]。

根節點的值為 5 ,但是其右子節點值為 4 。

思路:**

方法1:

20

/ \ 10

30 \

25這個返回的是true,但顯然不是二叉搜尋樹。

最後參考了別人的**,新增了乙個最大最小值,來限定每個節點的有效取值範圍。假設任一根節點root的取值範圍為(min,max),則左子女的取值範圍為(min,root.val),右子女的取值範圍是(root.val,max),依次執行下去,一旦檢測到節點值不在這個範圍則返回 false。真是太機智了。還有就是在傳輸過程中原函式不能夠傳遞最大最小值,又重新定義了乙個函式呼叫,值得學習。

public

boolean

isvalidbst

(treenode root)

public

boolean

subtree

(treenode root,

long min,

long max)

if(root.valmin

&&subtree

(root.left,min,root.val)

&&subtree

(root.right,root.val,max)

)else

}

方法2:二叉搜尋樹的中序遍歷結果是乙個嚴格遞增的序列,利用這一約束條件也可以判斷是否是二叉搜尋樹。

class

solution

public

boolean

inorder

(treenode root)

return

true;}

}

總結:

以上兩種方法的時間複雜度都是o(n),遞迴的空間複雜度也都是o(logn)。

驗證二叉搜尋樹

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

驗證二叉搜尋樹

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

驗證二叉搜尋樹

leetcode 98題 給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。必然從二叉搜尋樹的特性出發。容易知道,二叉搜尋樹的中序遍歷是乙個遞增的陣列。所...