树与二叉树

树与二叉树

树结构是一类重要的非线性结构。树是以分支关系定义的层次结构。

树结构中有n个结点的有限集,当n=0时;称为空树;当n不为0是,为非空树。对于非空树:有且只有一个称之为根的结点。除根节点外 的其余结点可分为m个互不相交的有限集,其中每一个集合本身又是一棵树,并且称为根的子树。

树的基本术语:

结点树中的一个独立单元。

结点的度:节点拥有的子树数称为结点的度。例如图中A的度为3。

树的度:树的度是树中各结点度的最大值。

叶子:度为0的树称为叶子。

非终端结点:度不为0的结点称为非终端节点或分支节点。

双亲和孩子:结点的子树的根称为该结点的孩子,相应地,该结点称为孩子的双亲。

兄弟:同一个双亲的孩子称为兄弟。

祖先:从根该结点所经分支上的所有结点。

子孙:以某结点为根的子树中的任一结点都称为该结点的子孙。

层次:结点的层次从根开始定义起,根为第一层,根的孩子为第二层。树中任一结点的层次等于双亲结点的层次加一。

堂兄弟:双亲在同一层次的结点称为堂兄弟。

树的深度:树中结点的最大层次称为树的深度或高度。

二叉树:

二叉树与树一样具有递归性质,二叉树与树的区别主要有两点:

1:二叉树每一个结点至多有两个孩子,即二叉树中不存在度大于2的树。

2:二叉树的子树有左右之分,其次序不能颠倒。

二叉树的性质:

性质1:在二叉树的第i层最多有2的(i-1)次方个结点。

性质2:深度为k的二叉树至多有2的k次方减一个结点。

性质3:对任何一棵树,如果其终端结点数为n,度为2结点数为k,则n=k-1。

满二叉树:深度为k且含有2的k次方减一个结点的二叉树。

满二叉树的特点:每一层上的结点数都是最大结点数。

完全二叉树:深度为k’的,有n个结点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中的编号从1至n的结点一一对应时,称为完全二叉树。

完全二叉树的特点:

  1. 叶子结点只可能在层次最大的两层上出现;
  2. 对任一结点,若其右分支下的子孙的最大层次为i,则其左分支下的子孙的最大层次必为i或i+1。

二叉树的遍历:(遍历结果为上图中的满二叉树的遍历结果)

1:先序遍历:

  1. 访问根结点;
  2. 先序遍历左子数;
  3. 先序遍历右子树;

先序遍历结果:ABDECFG

2:中序遍历:

  1. 中序遍历左子数
  2. 访问根结点
  3. 中序遍历右子树

中序遍历结果:DBEAFCG

3:后序遍历:

  1. 后序遍历左子数
  2. 后序遍历右子树
  3. 访问根结点

后序遍历结果:DEBFGCA

由二叉树的先序遍历和中序遍历,或后序遍历和中序遍历均能唯一确定一棵二叉树。由此可以知道,要确定一棵二叉树必须知道其中序遍历。

C语言代码实现

首先定义一个二叉树结构和二叉树结点结构

 

初始化二叉树,并将根结点设为空

 

按照层序法将一个数组当中的元素插入到二叉树当中。

 

下面是二叉树的三种遍历的代码实现:

先序遍历:

中序遍历:

后序遍历:

清空树:

 

查找二叉树当中值为x的结点并返回:

 

查看二叉树的高度:

代码演示:

 

代码实现当中的二叉树的三种遍历,二叉树的查找,二叉树的删除,以及查看二叉树的高度的代码实现部分都用到的了递归,还是比较难以理解的,对这部分代码不太理解的可以多看看递归方面的知识。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

带点脑子~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值