当前位置:   article > 正文

数据结构(5.2_3)——二叉树的存储结构

数据结构(5.2_3)——二叉树的存储结构

二叉树的顺序存储

  1. #define MAXLEN 255
  2. struct TreeNode {
  3. ElemType value;//结点中的数据元素
  4. bool isEmpty;//结点是否为空
  5. };
  6. void main() {
  7. TreeNode t[MaxSize];
  8. }

定义一个长度为MaxSize的数组t,按照从上至下、从左至右的顺序依次存储完全二叉树中的各个结点

几个重要常考的基本操作:

  • i的左孩子      ——2i
  • i的右孩子      ——2i+1
  • i的父结点      ——[i/2]
  • i所在的层次   ——[log_{2}(n+1)][log_{2}(n)]+1

完全二叉树中共有n个结点,则

判断i是否有左孩子?  ——2i<=n

判断i是否有右孩子?  ——2i+1<=n

判断i是否是叶子/分支结点? ——i>[n/2]?

:二叉树的顺序存储中,一定要把二叉树的结点编号与完全二叉树对应起来

最坏情况:高度为h且只有h个结点的单支树(所有结点只有右孩子),也至少需要2^{h}-1个存储单元

结论

二叉树的顺序存储结构只适合存储完全二叉树 

二叉树的链式存储

  1. //二叉树的结点(链式存储)
  2. typedef struct BiTNode {
  3. ElemType data;//数据域
  4. struct BiTNode *lchild, * rchild;//左、右孩子指针
  5. }BiTNode,*BiTree;

注意:n个结点的二叉链表共有n+1个空链域 

代码实现创建二叉树的链式存储并插入根节点和第二个结点

  1. struct ElemType
  2. {
  3. int value;
  4. };
  5. //二叉树的结点(链式存储)
  6. typedef struct BiTNode {
  7. ElemType data;//数据域
  8. struct BiTNode *lchild, * rchild;//左、右孩子指针
  9. }BiTNode,*BiTree;
  10. void main() {
  11. //定义一颗空树
  12. BiTree root = NULL;
  13. //插入根结点
  14. root = (BiTNode*)malloc(sizeof(BiTNode));
  15. root->data = { 1 };
  16. root->lchild = NULL;
  17. root->rchild = NULL;
  18. //插入新结点
  19. BiTNode *p = (BiTNode*)malloc(sizeof(BiTNode));
  20. p->data = { 2 };
  21. p->lchild = NULL;
  22. p->rchild = NULL;
  23. root->lchild = p;//作为根节点的左孩子
  24. }

三叉链表(方便寻找父结点)

  1. //二叉树的结点(链式存储)
  2. typedef struct BiTNode {
  3. ElemType data;//数据域
  4. struct BiTNode *lchild, * rchild;//左、右孩子指针
  5. struct BiTNode* parent;//父节点指针
  6. }BiTNode,*BiTree;

总结:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/856641
推荐阅读
相关标签
  

闽ICP备14008679号