Swift - 判断一棵树是否为二叉查找树

demo下载地址

二叉查找树的定义

左子树节点的值都小于根节点的值,右子树节点的值都大于根节点的值

问题描述

判断一棵树是否为二叉查找树?

例子下面就是二叉查找树

在这里插入图片描述

代码

//判断一棵二叉树是否为二叉查找树
    func p_isValidBST(root:TreeNode?) -> Bool {
        return helper(node: root, min: nil, max: nil)
    }
    
    private func helper(node: TreeNode?, min: Int?,max:Int?) -> Bool {
        guard let node = node else {
            return true
        }
        //所有右子树节点的值必须大于根几点的值
        if let min = min ,node.val <= min
        {
            return false
        }
        //所有左子树节点的值必须都小于根节点的值
        if let max = max, node.val >= max {
            return false
        }
        
        return helper(node: node.left, min: min, max: node.val) && helper(node: node.right, min: node.val, max: max)
    }
    

测试

 @objc func isValidBST()
    {
        
        //给定二叉树 [50, 20, 60, 15, 30,70]
        
        let root = TreeNode.init(val: 50)
        root.left = TreeNode.init(val: 20)
        root.right = TreeNode.init(val: 60)
        
        let second = root.left
        second?.left = TreeNode.init(val: 15)
        second?.right = TreeNode.init(val: 30)
        
        let thred = root.right
        thred?.right = TreeNode.init(val: 70);
        
        let result = self.p_isValidBST(root: root)
        print("判断一棵二叉树是否为二叉查找树\(result)")
        
    }

结果

在这里插入图片描述

注意点

  • 二叉树本身是有递归定义的,所以,从原理上讲,所有二叉树的东西都可以用递归来解
  • 二叉树这类题目很容易牵扯到是往左还是往右问题,所以在写helper 函数时要想到有两个相对应的参数
  • 记得处理节点为nil 的情况,尤其要注意根节点为nil 的情况
发布了128 篇原创文章 · 获赞 106 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/Z1591090/article/details/102612657