语言的数据结构:树与二叉树(二叉树篇)

前言

上文说到了树,有人认为二叉树是树的每一个分支都有两个子节点。其实这也对。但二叉树在此基础上还做了限制。比如区别了左子树与右子树。也就是说,当二叉树的根只有一个孩子时,也需要知道这个是左孩子还是右孩子。就是因为这个原因,让二叉树的性能相对于树有了明显的提高。也让二叉树成了一个全新的概念,而不是树的一个特别情况而已。

概念

二叉树(Binary Tree) 是树的一种常见形式,它是一棵有序树。它的子节点最多只有两个,分为左子树和右子树,哪怕只有一个子节点,也要区分出是左子树还是右子树,如果颠倒了,就是一棵新的二叉树了。二叉树的度最大为2。
二叉树常被用于实现二叉查找树和二叉堆,树的很多问题都可以通过 B F S 广度优先搜索算法 \color{orange} BFS广度优先搜索算法 BFS广度优先搜索算法 D F S 深度优先搜索算法( D e p t h F i r s t S e a r c h ) \color{orange}DFS深度优先搜索算法(Depth First Search) DFS深度优先搜索算法(DepthFirstSearch解决。

特别的二叉树

满二叉树

一个二叉树,如果它有子节点,并且子节点数都是最大值( 在每一层上没有空缺的位置 \color{orange}在每一层上没有空缺的位置 在每一层上没有空缺的位置),则称为满二叉树。一个满二叉树,除了根节点,其余节点数都是2个一起出现的,如 B与C、D与E、F与G。 所以如果满二叉树的层级为K,则
节点数
  2 k − 1 \ 2^k-1  2k1 。这个 -1,就是因为根节点只有一个。
如果节点数为N,则
高度
: h = l o g 2 ( N + 1 ) log_2(N+1) log2(N+1)
image.png

完全二叉树

满二叉树是完全二叉树特殊情况,当满二叉树从最后的节点依次减少时,形成的就是完全二叉树。完全二叉树从根节点、左子树、右子树的顺序执行,一直到树结束都没有空缺的节点。
image.png
image.png

存储结构

顺序存储

可以使用数组来存储。但只适用于满二叉树和完全二叉树的情况。否则如果中间缺失了节点,在数组中相应的位置就要空在那里,造成了空间的浪费。之所以F的位置要空在这里,是因为G是C的右子树,而左子树是没有节点的。如果那个位置不空着,则G就表示为左子树了。这也就是用数组存储的不好之处了。

image.png image.png

链式存储

用链表来创建树结构。注意:此时用链表来表示树,并非说此时的树就是线性结构。而是用链表重新去定义一种数据结构。此时这个结构只能称作树,而不可以称作链表。
用链表创建树的好处就是左子树与右子树的表示。如上面的示例,直接在每个节点上存储三个信息:1、数据本身的信息,2、左子树的指针,3、右子树的指针。这时G就直接可以表示为C的右子树,而其左子树指向NULL。

// 二叉树节点的结构体定义  
typedef struct TreeNode {  
    int val;            // 节点的值  
    struct TreeNode *left;   // 左子树  
    struct TreeNode *right;  // 右子树  
} TreeNode; 

查找方式

对二叉树的查找有三种方式,是按照查找根的点的顺序来区分的。 先序 \color{orange}先序 先序(根节点、左子树、右子树), 中序 \color{orange}中序 中序(左子树、根节点、右子树), 后序 \color{orange}后序 后序(左子树、右子树、根节点)。

image.png

前序的访问顺序:A B D E C G
中序的访问顺序:D B E A C G
后序的访问顺序:D E B G C A

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值