二叉树-定义及特征

本文主要介绍了二叉树相关知识。首先阐述其定义,指出它是特殊树形结构,与度为2的有序树有区别。接着介绍满二叉树、完全二叉树等几种特殊二叉树。最后说明了二叉树的性质,如叶子结点数与度为2的结点数关系等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、二叉树的定义

       二叉树是一种特殊的树形结构,其特点是每个结点至多只有两颗子树,并且二叉树的子树有左右之分,次序不能颠倒。

       二叉树是n(n≥0)个结点的有限集合:其或者为空二叉树(n=0),或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树。

       二叉树是有序树,若将其左右子树颠倒,则成为另一棵不同的二叉树。即使树中结点只有一棵子树,也要区分是左子树还是右子树。其有五种基本形态如下:

       二叉树与度为2的有序树的区别:

       (1)度为2的树至少有3个结点(根结点),而二叉树可以为空;

       (2)度为2的有序树的孩子结点的左右次序是相对于另一孩子结点而言的,若某个结点只有一个孩子结点,则这个孩子结点无需分左右。但二叉树左右孩子是确定的。

 

二、几个特殊的二叉树

1.满二叉树

       一棵高度为h,且含有个结点的二叉树称为满二叉树,即树中的每层都含最多结点。直接上图来的更直接一些:

       满二叉树的叶子结点都集中在二叉树的最下一层,并且除叶子结点之外的每个结点度数均为2。自上而下,自左至右对满二叉树编号,对于编号为i的结点,若有双亲,其双亲为,若有左孩子,则左孩子为2i;若有右孩子,则右孩子为2i+1。

 

2.完全二叉树

       设一个高度为h,有n个结点的二叉树,当且仅当其每个结点都与高度为h的满二叉树中编号为1~n的结点一一对应时,称为完全二叉树。如图所示:

       其具有如下特点:

       (1)若i≤,则结点i为分支结点,否则为叶子结点;

       (2)叶子结点只可能在层次最大的两层上出现。对于最大层次中的叶子结点,都依次排列在该层最左边的位置上;

       (3)若有度为1的结点,则只可能有一个,且该结点只有左孩子而无右孩子;

       (4)按层序编号后,一旦出现某结点(编号为i)为叶子结点或只有左孩子,则编号大于i的结点均为叶子结点;

       (5)若n为奇数,则每个分支节点都有左孩子和右孩子;若n为偶数,则编号最大的分支结点(编号为n/2)只有左孩子,没有右孩子,其余分支结点左孩子右孩子都有。

 

3.二叉排序树

       一棵二叉树或者是空二叉树,或者是具有如下性质的二叉树:左子树上所有结点的关键字均小于根结点的关键字;右子树上的所有结点的关键字均大于根结点的关键字。左子树和右子树又各是一棵二叉排序树。

 

4.平衡二叉树

       树上任一结点的左子树和右子树的深度之差不超过1。

 

5.红黑树

       红黑树是一种自平衡二叉查找树。

 

三、二叉树的性质

 

1.非空二叉树上的叶子结点数等于度为2的结点数加1,即

       证明:设度为0、1和2的结点个数分别为,结点总数。二叉树中的分支数除根结点外,其余结点都有一个分支进入,设B为分支总数,则n=B+1。由于这些分支是由度为1或2的结点射出的,所以又有。所以我们得到,则

 

2.非空二叉树上第k层上至多有个结点(k≥1);

 

3.高度为h的二叉树至多有个结点(h≥1);

 

4.对完全二叉树按从上到下、从左到右的顺序依次编程1,2,…,n,则有以下关系:

(1)当i>1时,结点i的双亲结点编号为,即当i为偶数时,其双亲结点的编号为i/2,它是双亲结点的左孩子;当i为奇数时,其双亲结点的编号为(i-1)/2,它是双亲结点的右孩子。

(2)当2i≤n时,结点i的左孩子编号为2i,否则无左孩子;

(3)当2i+1≤n时,结点i的右孩子编号为2i+1,否则无右孩子;

(4)结点i所在层次(深度)为

 

5.具有n个(n>0)结点的完全二叉树的高度为

 

### 计算二叉树中叶子节点的数量 在处理二叉树数据结构时,计算叶子节点数量是一个常见的需求。通过递归方法可以有效地解决这一问题。 #### 方法概述 对于一棵给定的二叉树,如果当前节点既无左子树也无右子树,则该节点即为叶子节点。可以通过递归遍历整棵树并计数满足上述条件的节点数目来获得总的叶子节点数[^1]。 #### C语言实现代码示例 下面提供了一个简单的C程序用于定义二叉树结构以及相应的函数`LeafCount`用来统计叶子节点: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构 typedef struct TreeNode { int data; struct TreeNode *left, *right; } Node; Node* CreateTreeNode(int value){ Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = value; newNode->left = NULL; newNode->right = NULL; return newNode; } int LeafCount(Node* root) { if (!root) // 如果根为空则返回0 return 0; if (!(root->left || root->right)) // 当前节点没有孩子节点说明是叶节点 return 1; // 否则累加左右子树上的叶节点总数 return LeafCount(root->left)+LeafCount(root->right); } ``` 此段代码首先定义二叉树节点的数据类型,并实现了创建新节点的功能;接着给出了核心算法——`LeafCount()` 函数,它接收指向某棵子树根部指针作为参数,当遇到空树时返回零,而一旦发现某个节点没有任何分支就将其计入结果之中[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值