-
Notifications
You must be signed in to change notification settings - Fork 15
/
98-validate-binary-search-tree.go
160 lines (137 loc) · 3.17 KB
/
98-validate-binary-search-tree.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/**
@author: Jason Pang
@desc:
@date: 2022/2/20
**/
package algorithm
/*
原题:https://leetcode-cn.com/problems/validate-binary-search-tree/
98. 验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:root = [2,1,3]
输出:true
示例 2:
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。
提示:
树中节点数目范围在[1, 104] 内
-231 <= Node.val <= 231 - 1
*/
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
//错误解法
func isValidBSTWrong(root *TreeNode) bool {
return dspValidBST(root)
}
func dspValidBST(node *TreeNode) bool {
if node == nil {
return true
}
if node.Left != nil && node.Left.Val >= node.Val {
return false
}
if node.Right != nil && node.Right.Val <= node.Val {
return false
}
return dspValidBST(node.Left) && dspValidBST(node.Left)
}
//错误
//左子树确认最大值,右子树确认最小值
func isValidBSTWrong2(root *TreeNode) bool {
if root == nil {
return false
}
res, _ := newdspValidBST(root, "")
return res
}
func newdspValidBST(node *TreeNode, dir string) (res bool, val int) {
lIsVal, rIsVal := true, true
lV, rV := node.Val, node.Val
if node.Left != nil {
lIsVal, lV = newdspValidBST(node.Left, "l")
}
if node.Right != nil {
rIsVal, rV = newdspValidBST(node.Right, "r")
}
//如果有一个不合格,都不合格
if lIsVal == false || rIsVal == false {
return false, 0
}
//判断左右子树是否合规
if (node.Left != nil && node.Val <= lV) || (node.Right != nil && node.Val >= rV) {
return false, 0
}
if (node.Left != nil && node.Val <= node.Left.Val) || (node.Right != nil && node.Val >= node.Right.Val) {
return false, 0
}
//判断极值
if dir == "l" { //左子树确认最大值
if node.Right != nil {
return true, rV
}
return true, node.Val
}
if dir == "r" { //右子树确认最小值
if node.Left != nil {
return true, lV
}
return true, node.Val
}
return true, node.Val
}
//中序遍历,判断是否递增
var bstVal []int
func isValidBST(root *TreeNode) bool {
bstVal = make([]int, 0)
dspVal(root)
//fmt.Println(bstVal)
for i := 1; i < len(bstVal); i++ {
if bstVal[i]-bstVal[i-1] <= 0 {
return false
}
}
return true
}
func dspVal(node *TreeNode) {
if node == nil {
return
}
dspVal(node.Left)
bstVal = append(bstVal, node.Val)
dspVal(node.Right)
}
//中序遍历优化,判断是否递增
func isValidBSTOpt(root *TreeNode) bool {
bstVal = make([]int, 0)
return dspValOpt(root)
}
func dspValOpt(node *TreeNode) bool {
if node == nil {
return true
}
res := dspValOpt(node.Left)
if res == false {
return false
}
if len(bstVal) > 0 && node.Val <= bstVal[len(bstVal)-1] {
return false
}
bstVal = append(bstVal, node.Val)
res = dspValOpt(node.Right)
if res == false {
return false
}
return true
}