golang刷leetcode 技巧(44)合法二叉搜索树

2022-08-02 18:49:42 浏览数 (1)

实现一个函数,检查一棵二叉树是否为二叉搜索树。

示例 1:

代码语言:javascript复制
输入:
    2
   / 
  1   3
输出: true

示例 2:

代码语言:javascript复制
输入:
    5
   / 
  1   4
     / 
    3   6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
     根节点的值为 5 ,但是其右子节点值为 4 。

解题思路

1,如果没有叶子节点返回true

2,如果左子树非空,需要返回前缀节点路径上的最大值,且比根节点小

3,如果右子树非空,需要返回后缀节点路径上的最小值,且比根节点大

4,左右子树都是合法的

5,需要注意,不是前缀节点是前缀节点路径最大值

测试用例

[5,1,4,null,null,3,6]

[5,14,null,1]

代码实现

代码语言:javascript复制
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isValidBST(root *TreeNode) bool {
   if root==nil || (root.Left==nil && root.Right==nil) {
       return true
   }

   valid:=true
   if root.Left!=nil{
      l:=pre(root.Left)
      if l>=root.Val{
          valid=false
      }
      fmt.Println(l,root)
   }
   if root.Right!=nil{
      r:=suc(root.Right)
      if r<=root.Val{
          valid=false
      }
       fmt.Println(r,root)
   }
   return valid && isValidBST(root.Left) && isValidBST(root.Right)
}

func pre(root * TreeNode) int{
    //root !=nil
    max:=root.Val
    cur:=root
    for cur!=nil{
        if cur.Right!=nil{
            cur=cur.Right
            if max<cur.Val{
            max=cur.Val
            }
        }else{
            cur=cur.Left
            if cur!=nil && max<cur.Val{
                max=cur.Val
            }
        }
    }
    return max
}

func suc(root*TreeNode)int{
     min:=root.Val
    cur:=root
    for cur!=nil{
        if cur.Left!=nil{
            cur=cur.Left
            if min >cur.Val{
            min=cur.Val
            }
        }else{
            cur=cur.Right
            if cur!=nil &&  min >cur.Val{
                min=cur.Val
            }
        }
    }
    return min
}

0 人点赞