給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。
假設乙個二叉搜尋樹具有如下特徵:
節點的左子樹只包含小於當前節點的數。
節點的右子樹只包含大於當前節點的數。
所有左子樹和右子樹自身必須也是二叉搜尋樹。
示例 1:
輸入:2
/ \1 3
輸出: true
示例 2:
輸入:5
/ \1 4
/ \3 6
輸出: false
解釋: 根節點的值為 5 ,但是其右子節點值為 4 。
使用遞迴依次判斷。
如果是合格的二叉樹,中序遍歷的結果應該是公升序排列的。
1#定義二叉樹
2class
treenode:
3def
__init__(self, x): #
self相當於類的例項
4 self.val =x
5 self.left =none
6 self.right =none78
9class
solution(object):
10@staticmethod
11def
is_valid_bst(root: treenode): # 由於是靜態的,所以不需要self
12 res = #
儲存遍歷結果
1314
def helper(root_node): #
輔助函式,用以遍歷節點
15if root_node is none: #
空樹也是合格的bst
16return
true
17 help(root_node.left) #
遞迴左子樹
執行中序遍歷
19 help(root_node.right) #
遞迴遍歷右子樹
20 helper(root) #
執行輔助函式
21return res == sorted(set(res)) #
由於可能存在相等的節點,故需要去重後判斷
1class
solution(object):23
defisvalidbst(self, root: treenode):
4if root is
none:
5return
true
6 self.res =
7 self.helper(root) #
初始化遞迴函式
8return self.res ==sorted(set(self.res))910
defhelper(self, root_node):
11if root_node is none: #
遞迴終止條件不可少
12return
13self.helper(root_node.left)
1415 self.helper(root_node.right)
1struct
treenode ;6};
78class
solution
20 treenode *pop_node = node.top(); //
不可以直接使用node.pop(),因為pop()不返回元素
21node.pop();
22 res.push_back(pop_node->val);
23 temp_node = pop_node->right;24}
25for (int i = 0; i < res.size() - 1; i++)
29return
true;30
}31 };
驗證二叉搜尋樹
題目 給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 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題 給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。必然從二叉搜尋樹的特性出發。容易知道,二叉搜尋樹的中序遍歷是乙個遞增的陣列。所...