一.树
以分支关系定义的层次结构
,n个节点的有限集合
一.树的基本定义
1.孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;
2.节点的度:一个节点含有的子节点的个数称为该节点的度;
3.叶节点或终端节点:度为0的节点称为叶节点;
4.非终端节点或分支节点:度不为0的节点;
5.双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
6.兄弟节点:具有相同父节点的节点互称为兄弟节点;
7.树的度:一棵树中,最大的节点的度称为树的度;
8.节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
9.树的高度或深度:树中节点的最大层次;
10.堂兄弟节点:双亲在同一层的节点互为堂兄弟
11.节点的祖先:从根到该节点所经分支上的所有节点;
12.子孙:以某节点为根的子树中任一节点都称为该节点的子孙;
13.森林:由M 棵互不相交的树的集合称为森林。
二.二叉树
1.定义:是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点
2.基本形态
1>空二叉树
2>只有根节点的二叉树
3>右子树为空
4>左子树为空
5>左右
3.特点
1>在二叉树中有左右孩子之说,并且次序不能颠倒,在树中没有
2>每个节点最多有两颗子树
4.性质
性质1.在二叉树的第i层上至多有2**(i-1)
性质2.在深度为k的二叉树上至多有2**k-1个结点
性质3.对任何一颗二叉树T,n0 = n2 + 1;
5.特殊形式的 二叉树
1>满二叉树:一颗深度为k且有2**k-1个结点。如下图所示
2>完全二叉树:编号与满二叉树的编号一一对应,就叫完全二叉树(怎么编号:从上到下、从左到右),如下图所示
###注意叶子节点数
性质4:具有N个结点的完全二叉树的深度为log2N
性质5:
三.二叉树的存储结构
1.顺序存储结构
以数组为例,
###当什么时候补的结点数最多
2.链式存储
3.树与二叉树的转化
1>
4.森林转化为二叉树
四.二叉树的遍历
1.先序遍历
结果:A B D C
2.中序遍历
结果:B D A C
先左结点,在根结点
3.后序遍历
结果:D B C A
五.二叉树的算法
1.递归算法
void preorder(JD *bt)
{
if(bt != NULL)
{
printf("%d\t",bt -> data);
preorder(bt -> lchild);
preorder(bt -> rchild);
}
}
2.非递归算法
1>先序遍历
void preordxer(Btree *b)
{
BTree *stack[MaxSize], *p;
int top = -1;
cout<<"先序遍历";
p = b;
while(p != null || top != -1) //第一层循环:
{
while(p != null) //第二层循环:判断结点是否有子树,即是否为空,
{
cout<<p -> data;
top++;
stack[top] = p;
p = p->lchild;
}
if(top != -1) //开始第二次出栈
{
p = stack[top];
top--;
p = p->rchild;
}
}
cout<<endl;
}
2>中序遍历
void preordxer(Btree *b)
{
BTree *stack[MaxSize], *p;
int top = -1;
cout<<"先序遍历";
p = b;
while(p != null || top != -1) //第一层循环:
{
while(p != null) //第二层循环:判断结点是否有子树,即是否为空,开始入栈
{
cout<<p -> data;
top++;
stack[top] = p;
p = p->lchild;
}
if(top != -1) //开始第二次出栈
{
p = stack[top];
top--;
p = p->rchild;
}
}
cout<<endl;
}
未完+修改。。。。。