一、二叉树基本概念
1、概念:
- 线性结构:描述数据一对一的关系(表)
- 非线性结构:描述数据一对多(树)、多对多(图)的关系
2、树形结构:
- 节点:组成树形结构的一个小的单元称为节点
- 根节点:只有后继,没有前驱
- 分支节点:既有前驱,又有后继
- 叶子节点:只有前驱,没有后继
- 前驱(祖先):由哪个节点可以访问到该节点
- 后继(子孙):该节点可以后续访问到哪些节点
- 层:根节点层数为1,后续每引申出的一个节点就在该节点层数上+1
- 树的层树:树的层数由层数最高的节点对应的层数表示树的层数
- 高度:节点高度是由该节点到最远的叶子节点的距离表示该节点高度
- 深度:节点深度是由该节点到根节点的距离表示节点深度
- 树的高度 == 树的深度 == 树的层数
- 度:后继节点的个数
3、二叉树:
1. 树形结构中的所有节点度数最大为2,称为二叉树
2. 二叉树节点类型:
- 叶子节点
- 只有左孩子
- 只有右孩子
- 左右孩子都有

3. 满二叉树和完全二叉树:
-
满二叉树:
所有叶子节点均在同一层,且每层节点个数均为最大值

特性:
满二叉树第k层节点有2^(k-1)
满二叉树前k层节点有2^(k) - 1
-
完全二叉树:
二叉树的编号(如果节点编号为n,左孩子编号:2n,右孩子编号为:2n+1)展开后是连续的,
称为完全二叉树

- 深度优先遍历(DFS)
- 前序遍历(先序遍历):根左右
- 中序遍历:左根右
- 后序遍历:左右根
- 广度优先遍历(BFS)
- 层序遍历:逐层从左到右依次遍历

二、完全二叉树的操作
1、节点定义

代码如下:

2、创建完全二叉树
通过函数递归完成完全二叉树的创建
- 申请节点空间
- 存放数据编号
- 如果存在左子树递归创建左子树
- 如果存在右子树递归创建右子树

代码如下:


3、完全二叉树深度优先遍历(递归函数实现)
1)前序遍历
int preorder_btree(treenode *proot)
{
//前序排列根左右
printf("%d",proot->no);if (proot->pleftchild != NULL)
{
preorder_btree(proot->pleftchild);
}if (proot->prightchild !=NULL)
{
preorder_btree(proot->prightchild);
}
return 0;
}
2)中序遍历
int inorder_btree(treenode *proot)
{
//中序遍历左根右
if (proot->pleftchild != NULL)
{
inorder_btree(proot->pleftchild);
}
printf("%d",proot->no);
if (proot->prightchild != NULL)
{
inorder_btree(proot->prightchild);
}
return 0;
}
3)后序遍历
int postorder_btree(treenode *proot)
{
//后序遍历 左右根
if (proot->pleftchild != NULL)
{
postorder_btree(proot->pleftchild);
}
if (proot->prightchild != NULL)
{
postorder_btree(proot->prightchild);
}
printf("%d",proot->no);return 0;
}
4、完全二叉树的广度优先遍历
层序遍历:

代码如下:

5、完全二叉树的销毁
代码如下 :


三、非完全二叉树
1、创建非完全二叉树
非完全二叉树,每个结构不一定相同,所以需要从终端接收用户输入决定二叉树的创建

2、获得非完全二叉树的高度、深度、层数


四、普通二叉树的深度优先遍历(非递归实现):

前序遍历

中序遍历

后序遍历
因为最后打印根节点,所以根节点需要2次入栈
第一次入栈,是为了出栈时找到该节点的右孩子,找到右孩子后,继续将节点入栈
第二次入栈,是为了打印该节点


896

被折叠的 条评论
为什么被折叠?



