【数据结构】 二叉树的链式结构

1. 二叉树的概念及结构

概念
1.可以是空树
2.当不是空树时,由根节点+根节点的左子树+根节点的右子树组成(根节点的左右子树也是二叉树)
特点
1.每个结点最多有两棵树
2.左右子树不能颠倒(必须是有序的)
结构(5种情况)
在这里插入图片描述
特殊二叉树-----满二叉树和完全二叉树(主要看图理解下)
满二叉树:每层都达到最大值,K层,每层的结点数都是2^(k-1) 满二叉数也是特殊的完全二叉树哦
完全二叉树:有右孩子必须有左孩子(下图2文字写反了)

在这里插入图片描述

2. 二叉树的存储结构

分两种:顺序结构、链式结构

顺序存储:典型的就是堆(完全二叉树),就是使用数组来存储,一般只适合表示完全二叉树(不是完全二叉树会有空间浪费)所以二叉树的顺序存储在物理上是一个数组,在逻辑上是一颗二叉树

链式存储
就是用链表来表示一颗二叉树,通常的方法是孩子表示法(二叉链)孩子双亲表示法(三叉链),这里主要讲二叉链,也就是孩子表示法,三叉链在红黑树部分再提(PS:二叉链和三叉链都是面试期间常考的)
链表中每个结点由三个域组成,数据域和左右指针域,左右指针域是左右孩子所在的链结点的存储地址,到这是不是就想到递归了,看图理解下
在这里插入图片描述

3. 二叉链式结构的实现

创建结点:结点的左右子树都是结点

typedef int BTDataType;
typedef struct BinTreeNode
{
   
 struct BinTreeNode* left;
 struct BinTreeNode* right;
 BTDataType val;
}BTNode;

3.1三种顺序的递归遍历(前、中、后)

遍历就是沿着某条搜索路径,树种每个结点只访问一次(下面的三种方式根据具体的应用场景来应用)

前序遍历:根结点+左子树+右子树
在这里插入图片描述

void beforeOrder(BTNode* root)
{
   
 if (root)
 {
   
  printf("%d ", root->val);
  beforeOrder(root->left);
  beforeOrder(root->right);
 }
}

中序遍历:左+根+右

void inOrder(BTNode* root)
{
   
 if (root)
 {
   
  inOrder(root->left);
  printf("%d ", root->val);
  inOrder(root->right);
 }
}

后续遍历:左+右+根

void endOrder(BTNode* root)
{
   
 if (root)
 {
   
  endOrder(root->left);
  endOrder(root->right);
  printf("%d ", root->val)
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值