题目
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
The left subtree of a node contains only nodes with keys less than the node’s key. The right subtree of a node contains only nodes with keys greater than the node’s key. Both the left and right subtrees must also be binary search trees. 就是判断一棵树是否是二叉搜索树
结题思路
使用中序遍历,左中右,然后使用一个pre记录前驱节点,当前节点与前驱节点进行比较,如果前驱>=当前节点,则返回false;
func isValidBST(root *TreeNode) bool {
var pre *TreeNode
return inorder(root,&pre)
}
func inorder(root *TreeNode,pre **TreeNode)bool{
if root==nil{
return true
}
res := inorder(root.Left,pre)
if !res{
return false
}
if (*pre)!=nil {
if (*pre).Val>=root.Val{
return false
}
}
*pre = root
return inorder(root.Right,pre)
}
遇到的问题
Go语言中指针的使用,由于是指传递,所以传递指针进去,在函数内若要对指针所指向的值进行修改,不能直接使用指针覆盖的方式,否则返回之后原来值还是没有改变。因为是指传递,所以他传递进函数的只是一个指针值,相当于该指针值得副本,利用副本对指针指向内容进行修改可以做到内外都修改(因为都是指向同一份数据),