前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >代码实现搜索二叉树、完全二叉树

代码实现搜索二叉树、完全二叉树

原创
作者头像
派大星在吗
发布2021-12-18 11:32:48
3250
发布2021-12-18 11:32:48
举报
文章被收录于专栏:我的技术专刊我的技术专刊

题目描述

给定一棵二叉树,已经其中没有重复值的节点,请判断该二叉树是否为搜索二叉树和完全二叉树。

示例1

输入:{2,1,3}

返回值:true,true

基本概念

搜索二叉树(Binary Search Tree - BST)

它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

总之:二叉搜索树中,左子树都比其根节点小,右子树都比其根节点大,递归定义。

重点来了!二叉搜索树的中序遍历一定是从小到大排序的。

完全二叉树(Complete Binary Tree- CBT)

若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边。

经典应用:堆

完全二叉树由满二叉树转化而来,也就是将满二叉树从最后一个节点开始删除,一个一个从后往前删除,剩下的就是完全二叉树。

实现代码

代码语言:txt
复制
# 思路:利用递归进行中序遍历,通过判断中序遍历序列是否有序来判定是否为搜索二叉树
代码语言:txt
复制
def isBSTmidTravelsal(self,root):
代码语言:txt
复制
    res = []
代码语言:txt
复制
    def dfs(root):
代码语言:txt
复制
        nonlocal res
代码语言:txt
复制
        if not root:
代码语言:txt
复制
            return 
代码语言:txt
复制
        dfs(root.left)
代码语言:txt
复制
        res.append(root.val)
代码语言:txt
复制
        dfs(root.right)
代码语言:txt
复制
    dfs(root)
代码语言:txt
复制
    return res==sorted(res)
代码语言:txt
复制
# 层次遍历
代码语言:txt
复制
# 使用队列,每移除一个节点就向队列添加左右节点,当遇到None时判断当前队列是否全是None,如果队列中除了None还有其它值则表示当前节点之后的节点还有左右子树即不是完全性二叉树。
代码语言:txt
复制
def isCBT(self,root):
代码语言:txt
复制
    q= [root]
代码语言:txt
复制
    while q:
代码语言:txt
复制
        for i in range(len(q)):
代码语言:txt
复制
            node=q.pop(0)
代码语言:txt
复制
            if  node is None:
代码语言:txt
复制
                if set(q)=={None}:
代码语言:txt
复制
                    return True
代码语言:txt
复制
                else:
代码语言:txt
复制
                    return False
代码语言:txt
复制
# 注意这里的空节点也要进队,因此不需要进行层次序列的空节点判断
代码语言:txt
复制
#                 if node.left:
代码语言:txt
复制
            q.append(node.left)
代码语言:txt
复制
#                 if node.right:
代码语言:txt
复制
            q.append(node.right)
代码语言:txt
复制
# newcoder完整代码
代码语言:txt
复制
# class TreeNode:
代码语言:txt
复制
#     def __init__(self, x):
代码语言:txt
复制
#         self.val = x
代码语言:txt
复制
#         self.left = None
代码语言:txt
复制
#         self.right = None
代码语言:txt
复制
#
代码语言:txt
复制
# 
代码语言:txt
复制
# @param root TreeNode类 the root
代码语言:txt
复制
# @return bool布尔型一维数组
代码语言:txt
复制
#
代码语言:txt
复制
class Solution:
代码语言:txt
复制
    def judgeIt(self , root ):
代码语言:txt
复制
        return [self.isBSTmidTravelsal(root),self.isCBT(root)]
代码语言:txt
复制
    def isBSTmidTravelsal(self,root):
代码语言:txt
复制
        res = []
代码语言:txt
复制
        def dfs(root):
代码语言:txt
复制
            nonlocal res
代码语言:txt
复制
            if not root:
代码语言:txt
复制
                return 
代码语言:txt
复制
            dfs(root.left)
代码语言:txt
复制
            res.append(root.val)
代码语言:txt
复制
            dfs(root.right)
代码语言:txt
复制
        dfs(root)
代码语言:txt
复制
        return res==sorted(res)
代码语言:txt
复制
    def isCBT(self,root):
代码语言:txt
复制
        q= [root]
代码语言:txt
复制
        while q:
代码语言:txt
复制
            for i in range(len(q)):
代码语言:txt
复制
                node=q.pop(0)
代码语言:txt
复制
                if  node is None:
代码语言:txt
复制
                    if set(q)=={None}:
代码语言:txt
复制
                        return True
代码语言:txt
复制
                    else:
代码语言:txt
复制
                        return False
代码语言:txt
复制
#                 if node.left:
代码语言:txt
复制
                q.append(node.left)
代码语言:txt
复制
#                 if node.right:
代码语言:txt
复制
                q.append(node.right)
代码语言:txt
复制
#         return True
代码语言:txt
复制
        # write code here

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
    • 示例1
    • 基本概念
      • 搜索二叉树(Binary Search Tree - BST)
        • 完全二叉树(Complete Binary Tree- CBT)
        • 实现代码
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档