5.4 二叉树的存储结构

36 篇文章 0 订阅
36 篇文章 0 订阅

一、二叉树的顺序存储

#define MaxSize 100
struct TreeNode{
    ElemType value;	//结点中的数据元素
    bool isEmpty;	//结点是否为空
};

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

//初始化时,所有的结点都标记为空
for(int i=0;i<MaxSize;i++){
    t[i].isEmpty=true;
}
//可以让第一个位置空缺,保证数组下标和结点编号一致


//几个常考的基本操作
//·i的左孩子--2i	·i的有孩子2i+1	·i的父节点对[i/2]向下取整	·i所在的层次=上一节的内容

【注】

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

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

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

二、二叉树的链式存储

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

//n个结点的二叉链表共有n+1个空链域【2n-(n-1)= n+1】

//定义一棵空树(root指向根节点)
BiTree root = NULL;

//插入根节点
root = (BiTree)malloc(sizeof(BiTNode));
root->data = {1};		//这里要用{}是因为 struct ElemType
root->lchild = NULL;
root->rchild = NULL;

//插入新的结点
BiTNode * p = (BiTNode *) malloc(sizeof(BiTNode));
p->data = {2};
p->lchild = NULL;
p->rchild = NULL;
root->lchild = p;	//作为根节点的左孩子

//如何找到指定结点p的父节点?只能从根节点开始遍历寻找

根据实际需求决定要不要加父结点指针:

//二叉树的结点(链式存储)
typedef struct BiTNode{
    ElemType data;				   //数据域
    struct BiTNode *lchild,*rchild	//左、右孩子指针
    struct BiTNode *parent;         //父结点指针(三叉链表--方便找到父节点)
}BiTNode,*BiTree;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值