【数据结构】树与二叉树

树的性质

  • 注意区分有序树和无序树
  • 树中的结点数等于所有结点的度数加1。
  • 度为m的树中第i层上至多有mi-1个结点(i >= 1)。
  • 高度为h的m叉树至多有(mh - 1) / (m - 1)个结点。
  • 具有n个结点的m叉树的最小高度为ceil(logm(n(m-1) + 1))。
  • 树的路径长度是所有路径长度的总和,树根到每个结点的路径的最大值应是树的高度减1。
  • 分支数等于树中各结点的度之和。
  • 总结点数 = n0 + n1 + n2 + … + nm (即度分别为n0…nm的结点个数的总和)
  • 总分支数 = 1n1 + 2n1 +…mnm
  • 总结点数 = 总分支数 + 1

二叉树的概念

非空二叉树上的叶子结点数等于度为2的结点数加1,即n0 = n2 + 1

二叉树与度为2的有序树的区别:

  • 度为2的树至少有3个结点,而二叉树可以为空
  • 二叉树的子树有左右之分,颠倒了是另外一棵二叉树,而度为2的树是无序树。

满二叉树

一棵高度为h,且含有2h - 1个结点的二叉树称为满二叉树。除叶子结点外每个结点度数为2.

完全二叉树

性质:

  1. 若i <= floor(n / 2),则结点i为分支结点,否则为叶子结点叶子结点数等于分支结点数或者分支结点数加1
  2. 叶子结点只可能在层次最大的两层上出现。
  3. 若有度为1的结点,则只可能有一个。
  4. 按层次编号后,一旦出现某结点(编号为i)为叶子结点或只有左孩子,则编号大于i的结点均为叶子结点。
  5. 此条性质可以按照满二叉树以及满二叉树去掉最后一个结点这两个特殊情况来理解:
    • 若n为奇数,则每个分支结点都有左子女和右子女。
    • 若n为偶数,则编号最大的分支结点(编号为n/2)只有左子女,没有右子女,其余分支结点左、右子女都有。

二叉排序树

平衡二叉树

树上任一结点的左子树和右子树的深度之差不超过1。

二叉树的性质

除了包含树的性质外,还有:

  • 非空二叉树上的叶子结点数等于度为2的结点树加1。

二叉

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您设计一个简单的菜单数据结构,包含二叉树的实现。 首先,我们可以定义一个节点类,用于表示菜单项。每个节点包含一个名称和一个指向其子节点的指针。对于二叉树,还需要包含指向其左右子节点的指针。 ```python class MenuItem: def __init__(self, name): self.name = name self.children = [] class BinaryMenuItem: def __init__(self, name): self.name = name self.left = None self.right = None ``` 接下来,我们可以定义一个菜单类,用于管理整个菜单。对于二叉树,菜单类都包含一个指向根节点的指针。 ```python class Menu: def __init__(self): self.root = None class BinaryTreeMenu: def __init__(self): self.root = None ``` 对于,我们可以实现添加子节点的方法。我们可以通过遍历来找到要添加子节点的节点,然后将新节点添加到其子节点列表中。 ```python class Menu: ... def add_child(self, parent, child): if not self.root: self.root = child else: node = self._find_node(self.root, parent) if node: node.children.append(child) def _find_node(self, node, target): if node.name == target: return node for child in node.children: found = self._find_node(child, target) if found: return found return None ``` 对于二叉树,我们可以实现插入节点的方法。我们可以从根节点开始遍历,找到一个没有左子节点或右子节点的节点,然后将新节点插入到该位置。 ```python class BinaryTreeMenu: ... def insert_node(self, name): new_node = BinaryMenuItem(name) if not self.root: self.root = new_node else: self._insert_node(self.root, new_node) def _insert_node(self, node, new_node): if not node.left: node.left = new_node elif not node.right: node.right = new_node else: self._insert_node(node.left, new_node) ``` 这样,我们就设计出了一个简单的菜单数据结构,包含了二叉树的实现。您可以根据具体需求进行修改和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值