2021-04-12:判断二叉树是否是搜索二叉树?

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-04-12:判断二叉树是否是搜索二叉树?相关的知识,希望对你有一定的参考价值。

2021-04-12:判断二叉树是否是搜索二叉树?    


福大大 答案2021-04-12:    


中序遍历有序即可。    

1.递归。    

2.莫里斯遍历。    


代码用golang编写。代码如下:    

package main
import "fmt"
const INT_MAX = int(^uint(0) >> 1)const INT_MIN = ^INT_MAX
func main() { head := &TreeNode{Val: 5} head.Left = &TreeNode{Val: 3} head.Right = &TreeNode{Val: 7} head.Left.Left = &TreeNode{Val: 2} head.Left.Right = &TreeNode{Val: 4} head.Right.Left = &TreeNode{Val: 6} head.Right.Right = &TreeNode{Val: 8} ret := isBST1(head) fmt.Println("递归:", ret) fmt.Println("----") ret = isBST2(head) fmt.Println("莫里斯遍历:", ret)}
//Definition for a binary tree node.type TreeNode struct { Val int Left *TreeNode Right *TreeNode}
func isBST1(head *TreeNode) bool { if head == nil { return true } ansVal := true ans := &ansVal preVal := INT_MIN pre := &preVal process(head, pre, ans) return *ans}func process(head *TreeNode, pre *int, ans *bool) { if head == nil { return } if *ans { process(head.Left, pre, ans) } if *ans { if *pre > head.Val { *ans = false } else { *pre = head.Val } } if *ans { process(head.Right, pre, ans) }}
// 根据morris遍历改写func isBST2(head *TreeNode) bool { if head == nil { return true } cur := head var mostRight *TreeNode preVal := INT_MIN for cur != nil { mostRight = cur.Left if mostRight != nil { for mostRight.Right != nil && mostRight.Right != cur { mostRight = mostRight.Right } if mostRight.Right == nil { //先 第一次到达 mostRight.Right = cur cur = cur.Left continue } else { //后 第二次到达 mostRight.Right = nil } } else { //先 只有一次到达 }
//此时cur就是中序 if preVal > cur.Val { return false } else { preVal = cur.Val }
//中 cur = cur.Right
} //后 return true}

执行结果如下:


***

[左神java代码](https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/class12/Code02_IsBST.java)    

[评论](https://user.qzone.qq.com/3182319461/blog/1618182168)


以上是关于2021-04-12:判断二叉树是否是搜索二叉树?的主要内容,如果未能解决你的问题,请参考以下文章

算法总结:左神class5—二叉树是否是平衡二叉树,搜索二叉树,平衡二叉树

怎么判断是不是是完全二叉树 用C++或C语言

二十一:判断二叉树是否是二叉查找树?

判断两个二叉树是否相同

[基础数据结构] 判断是否为完全二叉搜索树

天梯 - 是否完全二叉搜索树(判断序列插完是否是完全二叉树,并求出层序遍历)