具体逻辑请查看代码注释
package main import . "nc_tools" import "math" /* * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ /** * * @param root TreeNode类 the root * @return bool布尔型一维数组 */ func isSerachTree(root *TreeNode, left int, right int) bool { if root == nil { return true } if root.Val < left || root.Val > right { // 初始时如果根节点小于左边界,或者大于有边界,则不为搜索树 return false } return isSerachTree(root.Left, left, root.Val) && isSerachTree(root.Right, root.Val, right) // 递归判断左子树和右子树分别是否是搜索树, } // 往左子树传递时,左边界不变,有边界变为当前节点的值 // 往右子树传递时,有边界不变,左边界变为当前节点的值 func isTotalTree(root *TreeNode) bool { if root == nil { return true } queue := []*TreeNode{} queue = append(queue, root) for queue[0] != nil { popNode := queue[0] queue = queue[1:] //队首元素出队 queue = append(queue, popNode.Left) //将左子树入队 queue = append(queue, popNode.Right) //将右子树入队 } for len(queue) > 0 && queue[0] == nil { queue = queue[1:] } if len(queue) == 0 { return true } return false } func judgeIt(root *TreeNode) []bool { // write code here minValue := math.MinInt64 maxValue := math.MaxInt64 t1 := isSerachTree(root, minValue, maxValue) // 调用时用最小值控制左边界,最大值控制右边界 t2 := isTotalTree(root) res := []bool{} res = append(res, t1) res = append(res, t2) return res }