leetcode98 驗證二叉搜尋樹

2021-10-07 23:44:05 字數 1746 閱讀 7544

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

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

節點的左子樹只包含小於當前節點的數。

節點的右子樹只包含大於當前節點的數。

所有左子樹和右子樹自身必須也是二叉搜尋樹。

方法一: 遞迴

思路和演算法

要解決這道題首先我們要了解二叉搜尋樹有什麼性質可以給我們利用,由題目給出的資訊我們可以知道:如果該二叉樹的左子樹不為空,則左子樹上所有節點的值均小於它的根節點的值;

若它的右子樹不空,則右子樹上所有節點的值均大於它的根節點的值;它的左右子樹也為二叉搜尋樹。

這啟示我們設計乙個遞迴函式

helper

(root, lower, upper)

來遞迴判斷,函式表示考慮以 root 為根的子樹,判斷子樹中所有節點的值是否都在 (l,r)(l,r)(l,r) 的範圍內(注意是開區間)。如果 root 節點的值 val 不在

(l,r)(l,r)(l,r) 的範圍內說明不滿足條件直接返回,否則我們要繼續遞迴呼叫檢查它的左右子樹是否滿足,如果都滿足才說明這是一棵二叉搜尋樹。

那麼根據二叉搜尋樹的性質,在遞迴呼叫左子樹時,我們需要把上界 upper 改為 root.val,即呼叫

helper

(root.left, lower,root.val),

因為左子樹里所有節點的值均小於它的根節點的值。同理遞迴呼叫右子樹時,我們需要把下界

lower 改為 root.val,即呼叫

helper

(root.right, root.val, upper)。

函式遞迴呼叫的入口為 helper(root, -inf, +inf), inf 表示乙個無窮大的值。

class

solution

bool

isvalidbst

(treenode* root)

};

方法二:中序遍歷

思路和演算法

基於方法一中提及的性質,我們可以進一步知道二叉搜尋樹「中序遍歷」得到的值構成的序列一定是公升序的,這啟示我們在中序遍歷的時候實時檢查當前節點的值是否大於前乙個中序遍歷到的節點的值即可。如果均大於說明這個序列是公升序的,整棵樹是二叉搜尋樹,否則不是,下面的**我們使用棧來模擬中序遍歷的過程。

可能由讀者不知道中序遍歷是什麼,我們這裡簡單提及一下,中序遍歷是二叉樹的一種遍歷方式,它先遍歷左子樹,再遍歷根節點,最後遍歷右子樹。而我們二叉搜尋樹保證了左子樹的節點的值均小於根節點的值,根節點的值均小於右子樹的值,因此中序遍歷以後得到的序列一定是公升序序列。

class

solution

root = stack.

top();

stack.

pop();

// 如果中序遍歷得到的節點的值小於等於前乙個 inorder,說明不是二叉搜尋樹

if(root -

> val <= inorder)

return

false

; inorder = root -

> val;

root = root -

> right;

}return

true;}

};

leetcode 98 驗證二叉搜尋樹

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

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 1 3 輸出 true示例 2 輸入 5 1 4 3 6 輸出 false 解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 如果對二叉搜尋樹不夠了解,可能...