树的相关理论知识

文章介绍了树的基本概念,包括节点的度、叶子节点和分支节点等,强调了树的非线性层次关系。接着详细阐述了二叉树的定义、满二叉树和完全二叉树的特性,以及二叉树的性质,如层节点数量和结点关系。最后讨论了二叉树的两种存储方式:顺序存储和链式存储(二叉链和三叉链)。

1、树的相关概念

//树:树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成的一个具有层次关系的集合。(像一个倒挂的树,根朝上,枝叶朝下)

//1、关于树的概念
//节点的度:一个节点含有的子树的个数称为该结点的度。
//叶子节点:度为0的结点称为叶子结点。
//分支结点:度不为0的结点称为分支结点。
//父结点:若一个节点含有子节点,则这个结点为其子节点的父节点。
//子结点:若一个结点含有父节点,则这个结点为其父节点的子节点。
//节点的层次:从根开始定义,根为第一层,根的子节点为第二层,以此类推。
//树的高度或深度:树中节点的最大层次。
//节点的祖先:从根到该节点所经分支上的所有节点(自己是不是自己的祖先,看题目的说明)。
//子孙:以某节点为根的子树中任一节点都称为该节点的子孙。

2、树的结构特点

//2、树的结构特点
//a 子树是不相交的;
//b 除了根节点外,每个节点有且仅有一个父节点;
//c 一颗N个结点的树有(N-1)条边

3、树的表示

//3、树的表示
//树的最优表示方式:左孩子右兄弟表示法
typedef int DataType;
struct TreeNode
{
	DataType data;
	struct TreeNode* firstChild1;  //第一个孩子结点
	struct TreeNode* pNextBrother; //指向其下一个兄弟结点
};

4、二叉树的性质及相关习题

//4、二叉树
//概念:一颗二叉树是结点的有限集合,该集合:
//a 或者为空
//b 由一个根节点加上两颗称为左子树和右子树的二叉树组成。

//4.1 满二叉树:一个二叉树,如果每一个层的节点数都达到最大值,则这个二叉树就是满二叉树。【也就是说,如果一个二叉树的层数为:k,且
//结点总数为 2^k-1,则它就是二叉树】

//4.2 完全二叉树:一个层数为k的二叉树,其前k-1层的节点都是满的,第k层的结点不是满的,但第k层的结点是从左至右连续。
// 完全二叉树的结点分为:度为0的结点、度为1的结点(有1或0个)、度为2的结点【总数=n0+n1+n2】

//4.3 二叉树的性质
// 对于任意二叉树而言:
//a 若规定根节点的层数为1,则一颗非空二叉树的第k层上最多有2^(k-1)个结点。
//b 若规定根节点的层数为1,则深度为k的二叉树的最大节点数为(2^k-1);
//c 对于任意一颗二叉树,如果其叶子节点(度为0的结点)的个数为n0, 度为2的结点个数为n2,则有:n0=n2+1;
// 对于满二叉树而言:
//d 若规定根节点的层数为1,具有n个结点的满二叉树的深度: k=log2(n+1).
//对于完全二叉树而言:
//高度为h的完全二叉树,其节点范围为:[2^(h-1),2^h-1]。【节点最少时,最后一层只有一个节点;节点最多时,最后一层的节点是满的】

//关于二叉树性质的习题
//(1)某二叉树共有399个结点,其中有199个度为2的结点,则该二叉树中的叶子结点数为(B)
// A 不存在这样的二叉树  B 200  C 198  D 199

//(2)在具有2n个结点的完全二叉树中,叶子节点的个数为:(A)
//   A n  B n+1  C n-1  D n/2

//(3)一个具有767个节点的完全二叉树,其叶子节点个数为:(B)
//  A 383  B 384  C 385  D 386

//(4) 一颗完全二叉树的结点数为531个,则这棵树的高度为:(B)
//  A 11  B 10  C 8  D 12
//PS:高度为h的完全二叉树,其节点范围为:[2^(h-1),2^h-1]

5、二叉树的存储方式

//5、二叉树的存储方式
//a 顺序存储(适合满二叉树和完全二叉树)【以数组的形式存储】

//b 链式存储
typedef int BTDataType;
//二叉链:
struct BinaryTreeNode
{
	struct BinaryTreeNode* pLeft; //指向当前节点左孩子
	struct BinaryTreeNode* pRight; //指向当前节点右孩子
	BTDataType data; //当前节点值
};

//三叉链
struct BinaryTreeNode
{
	struct BinaryTreeNode* pParent; //指向当前节点双亲
	struct BinaryTreeNode* pLeft; //指向当前节点左孩子
	struct BinaryTreeNode* pRight; //指向当前节点右孩子
	BTDataType data; //当前节点值
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值