二叉树基本概念一览

二叉树基本概念一览


二叉树是数据结构中非常重要的内容,在计算机科学中,每个结点最多有两个子树的结构被称作二叉树,其相关概念繁多,学习起来让很多人头疼,本篇博文就其中一些比较重要的基础进行一下简单的梳理和介绍。

首先介绍一个二叉树中最基本的内容——**结点**,直观来看它就是二叉树中用圈圈框起来的一个个的点,其包含数据元素和若干指向子树的分支。

图1
下面就此展开。

子树

二叉树每个结点的的分支称作该结点的子树,其左侧分支称为左子树,右侧分支称为右字树。

结点层次

一个结点的层次直观上来说就是其所在的行,其中根结点层次为1(第一行),其子结点层次为2(第二行),以此类推,第l行的结点为l。

二叉树的深度(高度)

二叉树的深度(高度)指的是二叉树中的最大叶子结点所在的层。
二叉树的深度=max(左子树深度,右子数深度)+1,可用递归的方式实现。

如最上图中的二叉树深度为5。

结点的度

二叉树结点的度指该结点分支的个数,一棵非空二叉树结点的度只有以下三种情况:
  • 没有分支的结点度为0 :如下图中6、7、8、9、10
  • 只有一个分支(左或右)结点度为1 :如下图中5
  • 有两个分支的结点度为2:如下图中1、2、3、4
    图2
    二叉树结点的度最大为2。

结点种类

二叉树的结点主要有以下几种:
  • 根结点:第一层的结点 如上图1
  • 叶子结点 :度为0的结点,也就是没有分支的结点 上图6、7、8、9、10
  • 分支结点 :度不为0的结点 上图1、2、3、4、5
  • 孩子结点:结点的子树的根称为该结点的孩子 如2和3是1的孩子结点,4和5是2的孩子结点
  • 兄弟结点:同一双亲的孩子结点 如2和3,4和5,6和7,8和9
  • 祖先结点: 从根到该结点的所经分支上的所有结点 如10的祖先结点是1,2,5
  • 子孙结点:以某结点为根的子树中任一结点都称为该结点的子孙 如

关于结点有以下性质:

  1. 在非空二叉树中,第i层的结点总数最大为2^i-1,i>=1(满树情况)
  2. 深度为h的二叉树最多有 2^h-1个结点(h>=1),最少有h个结点
  3. 对于任意一棵二叉树,设其总结点数为N,如果其叶结点(度为0的结点)数为N0,而度数为2的结点总数为N2,则N0=N2+1,度为1的结点数N1=N-N0-N2
  4. 具有n个结点的完全二叉树的深度为log(N+1),底数为2
  5. 有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:
    若I为结点编号则 如果I>1,则其父结点的编号为I/2
    如果2×I<=N,则其左儿子(即左子树的根结点)的编号为2×I
    若2×I>N,则无左儿子
    如果2×I+1<=N,则其右儿子的结点编号为2×I+1
    若2×I+1>N,则无右儿子
  6. 给定N个结点,能构成h(N)种不同的二叉树。 h(N)为卡特兰数的第N项。h(n)=C(2*n,n)/(n+1)
  7. 设有i个分支点,I为所有分支点的道路长度总和,J为叶的道路长度总和J=I+2i

遍历

二叉树的基本遍历有三种:前序遍历、中序遍历和后序遍历,除此之外还有分层遍历等。其中基本遍历代码实现时可采用递归方式,其过程如下:
前序遍历:访问根结点;前序遍历左子树;前序遍历右子树 图2 12489[10]367
中序遍历:中序遍历左子树;访问根结点;中序遍历右子树     8492[10]51637
后序遍历:后序遍历左子树;后序遍历右子树;访问根结点     894[10]526731

分层遍历(广度优先搜索):用队列实现。队列初始化,压入根结点,队列不为空时,弹出一个结点,访问,左右子结点不为空时,压入左右子结点。

分类

完全二叉树:若设二叉树的高度为h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布

满二叉树:除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树

平衡二叉树(AVL):二叉排序树,空,或左子树和右子树都是平衡二叉树,且深度差<=1

这里写图片描述

参考:
http://baike.baidu.com/item/%E4%BA%8C%E5%8F%89%E6%A0%91?fr=aladdin

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树是一种非常重要的数据结构,它的基本操作包括创建、销毁、遍历、查找等。下面是二叉树基本操作的实现方法: 1. 创建二叉树:通过前序遍历的数组构建二叉树,其中 '#' 表示空节点。具体实现方法可以参考引用中的 BinaryTreeCreate 函数。 2. 销毁二叉树:遍历二叉树,依次释放每个节点的内存空间。具体实现方法可以参考引用中的 BinaryTreeDestory 函数。 3. 遍历二叉树二叉树的遍历包括前序遍历、中序遍历、后序遍历和层序遍历。具体实现方法可以参考引用中的 BinaryTreePrevOrder、BinaryTreeInOrder、BinaryTreePostOrder 和 BinaryTreeLevelOrder 函数。 4. 查找二叉树节点:在二叉树中查找值为 x 的节点,具体实现方法可以参考引用中的 BinaryTreeFind 函数。 5. 计算二叉树节点个数:计算二叉树中节点的个数,具体实现方法可以参考引用[2]中的 BinaryTreeSize 函数。 6. 计算二叉树叶子节点个数:计算二叉树中叶子节点的个数,具体实现方法可以参考引用中的 BinaryTreeLeafSize 函数。 7. 计算二叉树第 k 层节点个数:计算二叉树中第 k 层节点的个数,具体实现方法可以参考引用中的 BinaryTreeLevelKSize 函数。 8. 判断二叉树是否是完全二叉树:判断二叉树是否是完全二叉树,具体实现方法可以参考引用中的 BinaryTreeComplete 函数。 9. 计算二叉树的深度:计算二叉树的深度,具体实现方法可以参考引用中的 BinaryTreeDeep 函数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值