树和二叉树
树是n个结点的有限集合当n=0时称为空树,任意一颗非空树满足以下条件
1.有且仅有一个特定的称为根的节点。
2.当n>1时除根结点之外的其余节点被分成m个互不相交的有限集合T1,T2,。。。Tm;其中每个集合又是一棵树并称为这个根节点的子树。
结点的度·树的度:某结点所拥有的子树的个数称为该节点的度;树中各节点的度的最大值称为该树的度。
叶子节点分支节点:度为0的结点称为叶子结点,也称为终端节点度不为零的结点称为分支结点也称为非终端结点。
孩子双亲兄弟:某结点子树的根节点称为该结点的孩子结点,反之称为该节点的双亲结点,具有同一个双亲的孩子结点互称为兄第结点。
路径路径长度:一个点到另一个节点的边数成为路径长度这条路叫做路径
祖先子孙:从x到y有一条路径那么x就称为y的祖先,y称为x的子孙
结点的层数树的深度:根结点的层数为1某结点在k层则子结点在k+1层,树中所有结点的最大层数称为该树的深度。
有序树,无序树:如果一棵树中结点的各子树从左到右是有次序的即如果交换了各子树的相对位置则构成不同的树这棵树就是有序树否则就是无序树。
二叉树就是每个节点的孩子最多有两个的树 而且可以通过先序和中序确定后序序列
树的抽象数据类型定义
ADT Tree
Data
树是由一个根结点和若干棵子树构成,
树中结点具有相同数据类型及层次关系
Operation
InitTree
前置条件:树不存在
输入:无
功能:初始化一棵树
输出:无
后置条件:构造一个空树
DestroyTree
前置条件:树已存在
输入:无
功能:销毁一棵树
输出:无
后置条件:释放该树占用的存储空间
Root
前置条件:树已存在
输入:无
功能:求树的根结点
输出:树的根结点的信息
后置条件:树保持不变
Parent
前置条件:树已存在
输入:结点x
功能:求结点x的双亲
输出:结点x的双亲的信息
后置条件:树保持不变
Depth
前置条件:树已存在
输入:无
功能:求树的深度
输出:树的深度
后置条件:树保持不变
PreOrder
前置条件:树已存在
输入:无
功能:前序遍历树
输出:树的前序遍历序列
后置条件:树保持不变
PostOrder
前置条件:树已存在
输入:无
功能:后序遍历树
输出:树的后序遍历序列
后置条件:树保持不变
endADT
树的遍历操作
前序遍历 :树的前序遍历操作定义为:
若树为空,不进行遍历;否则
⑴ 访问根结点;
⑵ 按照从左到右的顺序前序遍历根结点的每一棵子树。
后序遍历 :树的后序遍历操作定义为:
若树为空,则遍历结束;否则
⑴ 按照从左到右的顺序后序遍历根结点的每一棵子树;
⑵ 访问根结点。
层序遍历 :树的层序遍历操作定义为:
从树的第一层(即根结点)开始,自上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。
二叉树
二叉树的定义
二叉树是n(n≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。
二叉树的特点:⑴ 每个结点最多有两棵子树;
⑵ 二叉树是有序的,其次序不能任意颠倒。
完全二叉树
对一棵具有n个结点的二叉树按层序编号,如果编号为i(1≤i≤n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同。
二叉链表
#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <cstring>
#include <algorithm>
#include <map>
#include <set>
using namespace std;
char c[9000];
struct Node{
char data;
Node *lson,*rson;
};
struct linkdou{
Node *first;
linkdou(){
first=new Node;
first=dfs();
}
Node* dfs(){
Node *x;
x=new Node;
x->lson=NULL;
x->rson=NULL;
char c;
cin>>c;
if(c=='#')
return NULL;
else
{
x->data=c;
x->lson=dfs();
x->rson=dfs();
}
return x;
}//这里构造函数递归构造#代表已经没有子树了这样才能返回先构造完子树再把子树的根节点作为儿子返回
void qianxu(Node *x){
if(x!=NULL){
cout<<x->data;
qianxu(x->lson);
qianxu(x->rson);
}
}
void zianxu(Node *x){
if(x!=NULL){
zianxu(x->lson);
cout<<x->data;
zianxu(x->rson);
}
}
void hianxu(Node *x){
if(x!=NULL){
hianxu(x->lson);
hianxu(x->rson);
cout<<x->data;
}
}
};