二叉树类型
相关术语
①结点:包含一个数据元素及若干指向子树分支的信息 。
②结点的度:一个结点拥有子树的数目称为结点的度 。
③叶子结点:也称为终端结点,没有子树的结点或者度为零的结点 。
④分支结点:也称为非终端结点,度不为零的结点称为非终端结点 。
⑤树的度:树中所有结点的度的最大值。
⑥结点的层次:从根结点开始,假设根结点为第1层,根结点的子节点为第2层,依此类推,如果某一个结点位于第L层,则其子节点位于第L+1层 。
⑦树的深度:也称为树的高度,树中所有结点的层次最大值称为树的深度 。
⑧有序树:如果树中各棵子树的次序是有先后次序,则称该树为有序树 。
⑨无序树:如果树中各棵子树的次序没有先后次序,则称该树为无序树 。
⑩森林:由m(m≥0)棵互不相交的树构成一片森林。如果把一棵非空的树的根结点删除,则该树就变成了一片森林,森林中的树由原来根结点的各棵子树构成 。
二叉树性质
性质1:二叉树的第i层上至多有2i-1(i≥1)个节点 。
性质2:深度为h的二叉树中至多含有2h-1个节点 。
性质3:若在任意一棵二叉树中,有n0个叶子节点,有n2个度为2的节点,则必有n0=n2+1 。
性质4:具有n个节点的完全二叉树深为log2x+1(其中x表示不大于n的最大整数)。
性质5:若对一棵有n个节点的完全二叉树进行顺序编号(1≤i≤n),那么,对于编号为i(i≥1)的节点:
当i=1时,该节点为根,它无双亲节点 。
当i>1时,该节点的双亲节点的编号为i/2 。
若2i≤n,则有编号为2i的左节点,否则没有左节点 。
若2i+1≤n,则有编号为2i+1的右节点,否则没有右节点 。
1.二叉树表的创建
//二叉树的建立
void CreatTree(tree *T)
{
char ch;
cin>>ch;
if(ch=='#')
*T=NULL;
else
{
*T=new Csnode;
if(!T)
return;
(*T)->data=ch;
printf("请输入%c的左子树: ",ch);
CreatTree(&(*T)->lchild);
printf("请输入%c的右子树: ",ch);
CreatTree(&(*T)->rchild);
}
}
2.前中后序遍历
//前序遍历算法
void PreCreat(tree T)
{
if(T==NULL)
return ;
cout<<T->data<<" ";
PreCreat(T->lchild);
PreCreat(T->rchild);
}
//中序遍历算法
void MidCreat(tree T)
{
if(T==NULL)
return ;
MidCreat(T->lchild);
cout<<T->data<<" ";
MidCreat(T->rchild);
}
//后序遍历算法
void RearCreat(tree T)
{
if(T==NULL)
return ;
RearCreat(T->lchild);
RearCreat(T->rchild);
cout<<T->data<<" ";
}
3.测试案例
#include<iostream>
using namespace std;
//二叉树的结构定义
typedef struct csNode
{
char data;
struct csNode*lchild;
struct csNode*rchild;
} Csnode,*tree;
//二叉树的建立
void CreatTree(tree *T)
{
char ch;
cin>>ch;
if(ch=='#')
*T=NULL;
else
{
*T=new Csnode;
if(!T)
return;
(*T)->data=ch;
printf("请输入%c的左子树: ",ch);
CreatTree(&(*T)->lchild);
printf("请输入%c的右子树: ",ch);
CreatTree(&(*T)->rchild);
}
}
//前序遍历算法
void PreCreat(tree T)
{
if(T==NULL)
return ;
cout<<T->data<<" ";
PreCreat(T->lchild);
PreCreat(T->rchild);
}
//中序遍历算法
void MidCreat(tree T)
{
if(T==NULL)
return ;
MidCreat(T->lchild);
cout<<T->data<<" ";
MidCreat(T->rchild);
}
//后序遍历算法
void RearCreat(tree T)
{
if(T==NULL)
return ;
RearCreat(T->lchild);
RearCreat(T->rchild);
cout<<T->data<<" ";
}
int main()
{
printf("请输入第一个节点的数据:\n");
tree T;
CreatTree(&T);
cout<<"前序遍历:";
PreCreat(T);
cout<<"\n中序遍历:";
MidCreat(T) ;
cout<<"\n后序遍历:";
RearCreat(T) ;
}
测试结果