GIS1之二叉搜索树(binary search tree)

什么是二叉树:

一个父节点最多有两个子节点.

什么是二叉搜索树:
创建(插入):

左子节点小于父节点, 右子节点大于等于父节点的二叉树.
举个例子:
对于数组:
83, 53, 20, 47, 75, 7, 5, 4, 65, 99
83为根节点, 53<83, 放在83左边, 20<83<53, 放在53左边, 47<83<53,但47>20, 所以放在20右边. 以此类推.
看图就都明白了:
在这里插入图片描述
这也是插入一个数的方法, 只需要比较就够了.

删除

如果我们要删除一个数, 比如53.
从前面的插入过程中, 我们知道,左子节点上的数总是小于父节点, 父节点又总是小于等于右子节点, 所以也就是这么个关系:

左子节点<父节点<=右子节点.

删除最末端的左子节点和右子节点对树的结构都是没有影响的, 但是如果删除父节点, 也就是带有子树的节点, 对整个树的结构就有影响了.
父节点只有一个子节点也比较简单, 直接删除后,子节点补位就可以了.
但如果有两个子树, 就会稍微复杂一点点. 让我们看上一个图, 其实删除53以后,用47和65来补位都可以, 但是由于右边是包含等于的情况的, 所以用65. 举个例子吧.
如果47后面还有个47,把47补过去以后, 就还要个47在补位的47的左侧, 这违反了规则.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 二叉搜索树Binary Search Tree):是一棵空树或者具有下列性质的二叉树:若它的子树不空,则子树上所有节点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;它的右子树也分别为二叉搜索树。 中序遍历序列:对于任意一棵二叉树,中序遍历的结果都是一个序列,这个序列称为中序遍历序列。 因此,判断一棵二叉树是否为二叉搜索树,可以先进行中序遍历,再判断遍历结果是否为升序序列。 以下是 Python 代码实现: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def inorderTraversal(root: TreeNode) -> List[int]: res = [] if not root: return res res.extend(inorderTraversal(root.left)) res.append(root.val) res.extend(inorderTraversal(root.right)) return res def isBST(root: TreeNode) -> bool: res = inorderTraversal(root) for i in range(1, len(res)): if res[i] <= res[i-1]: return False return True ``` 其中,`TreeNode` 是二叉树的节点类,`inorderTraversal` 函数是实现二叉树中序遍历的递归函数,`isBST` 函数是判断二叉树是否为二叉搜索树的函数。 ### 回答2: 要实现这个函数,首先我们可以使用递归的方式对二叉树进行中序遍历,即先遍历子树,再访问根节点,最后遍历右子树。遍历过程中将遍历到的节点值保存到一个数组中。 接下来,我们需要判断该数组是否是按升序排列的,即判断是否是一棵二叉搜索树。我们可以遍历数组,依次比较相邻的节点值,如果前一个节点的值大于等于后一个节点的值,则认为不是二叉搜索树。反之,如果整个数组都符合这个条件,则认为是一个二叉搜索树。 以下是一个简单的实现代码: ``` class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def inorderTraversal(root): if not root: return [] result = [] inorder(root, result) return result def inorder(root, result): if not root: return inorder(root.left, result) result.append(root.val) inorder(root.right, result) def isBST(root): inorder_result = inorderTraversal(root) for i in range(1, len(inorder_result)): if inorder_result[i] <= inorder_result[i-1]: return False return True ``` 这个函数的时间复杂度是O(n),其中n是二叉树中节点的数量,因为我们需要遍历每个节点并将节点的值保存到数组中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值