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

福大大 答案2021-04-12:

中序遍历有序即可。
1.递归。
2.莫里斯遍历。

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

package mainimport "fmt"const INT_MAX = int(^uint(0) >> 1)const INT_MIN = ^INT_MAXfunc 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代码
评论

©著作权归作者所有:来自51CTO博客作者福大大的原创作品,如需转载,请注明出处,否则将追究法律责任

每一份赞赏源于懂得

赞赏

0人进行了赞赏支持

更多相关文章

  1. 图 - 邻接表深度优先遍历(C语言)
  2. 图 -邻接表广度优先遍历(C语言)
  3. 图 - 邻接矩阵广度优先遍历(C语言)
  4. 图 - 邻接矩阵深度优先遍历(C语言)
  5. 浅谈递归 II
  6. [face_算法篇]:常见的二分、递归、选择、插入、冒泡、快排、归并
  7. 2021-04-04:给定一个非负数组arr,和一个正数m。 返回arr的所有子序
  8. 开眼界!Python 遍历文件可以这样做!
  9. 2021-04-02:给定一个正方形或者长方形矩阵matrix,实现zigzag打印。

随机推荐

  1. SQLServer---查询过程中的数据类型转化
  2. MySql 存储过程插入年月日
  3. sqlserverdate时间转换给出不正确的结果?
  4. 使用T-SQL中另一个(非xml)列的值更新XML
  5. 查看 SQL Server 作业(job)运行结果状态
  6. provider:Named Pipes Provider,error:40 -
  7. mysql中将多条记录合并成一行数据进行显
  8. MySQL——delete 和 truncate 以及 drop
  9. sql 对某一列去重及重复个数
  10. 删除重复数据,只保留ID最小的一条数据