数据结构二叉树排列与查找:假设一棵二叉排序树的关键字为单个字母,其后序遍历序列为ACDBFIJHGE,回答以下问题

画出该二叉排序树。
(2)求在等概率下的查找成功的平均查找长度。
(3)求在等概率下的查找不成功的平均查找长度

二叉排序树的概念:
二叉排序树是一种动态树表。
二叉排序树的定义:二叉排序树或者是一棵空树,
或者是一棵具有如下性质的二叉树:
⑴ 若它的左子树非空,则左子树上所有结点的值均小于根结点的值;
⑵ 若它的右子树非空,则右子树上所有结点的值均大于根结点的值;
⑶ 左、右子树本身又各是一棵二叉排序树。二叉排序树的性质: 按中序遍历二叉排序树,所得到的中序遍历序列是一个递增有序序列。

 

查找成功的平均查找长度为:∑(本层高度*本层元素个数)/节点总数

查找不成功的平均查找长度:∑(本层高度*本层补上的叶子个数)/补上的叶子总数

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
二叉排序树是一种特殊的二叉树,它满足以下两个条件: 1. 对于任意一个节点,它的左子树中所有节点的键值都小于该节点的键值,它的右子树中所有节点的键值都大于该节点的键值。 2. 对于任意一个节点,它的左子树和右子树都是二叉排序树二叉排序树的中序遍历结果是有序的。因此,我们可以通过输入键值序列建立一棵二叉排序树,然后中序遍历这棵二叉树,即可得到键值序列的有序输出。 下面是用二叉链表实现的建立二叉排序树和中序遍历的代码: ```python class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None class BST: def __init__(self): self.root = None def insert(self, val): if not self.root: self.root = TreeNode(val) else: node = self.root while node: if val < node.val: if not node.left: node.left = TreeNode(val) break else: node = node.left else: if not node.right: node.right = TreeNode(val) break else: node = node.right def inorder_traversal(self): stack = [] res = [] node = self.root while node or stack: while node: stack.append(node) node = node.left node = stack.pop() res.append(node.val) node = node.right return res # 示例 bst = BST() keys = [8, 3, 10, 1, 6, 14, 4, 7, 13] for key in keys: bst.insert(key) print(bst.inorder_traversal()) # 输出 [1, 3, 4, 6, 7, 8, 10, 13, 14] ``` 在上面的代码中,我们定义了 `TreeNode` 类来表示树节点,包含 `val`、`left`、`right` 三个属性。`BST` 类表示二叉排序树,包含 `root` 属性表示根节点。`insert` 方法用于插入节点,`inorder_traversal` 方法用于中序遍历二叉排序树并返回结果。在 `insert` 方法中,我们按照二叉排序树的规则将新节点插入到树中。在 `inorder_traversal` 方法中,我们使用栈来实现中序遍历,先将根节点和它的所有左子节点入栈,然后依次出栈并访问节点,再访问它的右子节点。 最后,我们可以通过输入一个键值序列来建立二叉排序树,并对树进行中序遍历,得到有序输出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dylan、

耕码不易,白嫖可耻

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值