由完备的先序序列创建二叉树
typedef struct bt //二叉树
{
int data;
struct bt* Lchild;
struct bt* Rchild;
}TREE,*LPtree;
LPtree Node(int data) //创建结点
{
LPtree newNode=new TREE;
newNode->data=data;
newNode->Lchild=NULL;
newNode->Rchild=NULL;
return newNode;
}
void create(LPtree &T) //递归创建二叉树(按先序序列)
{
int ch;
cin>>ch; //输入
if(ch=='#')
{
T=NULL;
}
else
{
T=Node(ch); //root
create(T->Lchild); //left subtree
create(T->Rchild);
}
}
由先序序列和中序序列创建二叉树
int i=0; //指向前序遍历序列的最后一个元素
void creatTree(LPtree &T,int a,int b) //根据序列创建二叉树 ,a,b为中序列数组起始和截止的下标
{
if(a<b)
{
int r=a;
T=Node(pre[i]); //创建根结点
while(mid[r]!=pre[i]&&r<b) r++; //根据先序序列找出中序序列中左右子树的分界线r
i++;
//递归先左后右
creatTree(T->LChild,a,r); //构建左子树
creatTree(T->RChild,r+1,b); //构建右子树
}
}
由后序序列和中序序列创建二叉树
int i=n-1; //指向后序遍历序列的最后一个元素
void creatTree(LPtree &T,int a,int b) //根据序列创建二叉树 ,a,b为中序列数组起始和截止的下标
{
if(a<b)
{
int r=a;
T=Node(pre[i]); //创建根结点
while(mid[r]!=post[i]&&r<b) r++; //根据后序序列找出中序序列中左右子树的分界线r
i--;
//递归先右后左
creatTree(T->RChild,r+1,b); //构建右子树
creatTree(T->LChild,a,r); //构建左子树
}
}
由先序序列和中序序列得到后序序列(不创建二叉树)
void swap(int r,int a,int b) //交换根和右
{
int c=post[r]; //根
for(int i=a;i<b;i++)
post[i-1]=post[i];
post[b-1]=c;
}
int i=0;
void createOrder(int a,int b) //依照先序和中序对中序序列进行左右子树交换得到后序序列
{
if(a<b)
{
int r=a; //根位置
while(mid[r]!=pre[i]&&r<b) r++;
i++;
createOrder(a,r); //左子树
createOrder(r+1,b); //右子树
swap(r,r+1,b); //交换根和右
}
}
由后序序列和中序序列得到先序序列(不创建二叉树)
void swap(int r,int a,int b) //交换根和左
{
int c=pre[r]; //根
for(int i=b;i>a;i--)
pre[i]=pre[i-1];
pre[a]=c;
}
int i=n-1;
void createOrder(int a,int b) //依照先序和中序对中序序列进行左右子树交换得到后序序列
{
if(a<b)
{
int r=a; //根位置
while(mid[r]!=post[i]&&r<b) r++;
i--;
createOrder(r+1,b); //右子树
createOrder(a,r); //左子树
swap(r,a,r); //交换根和左
}
}
二叉搜索树BST的创建
int k=0,a[N],n; //n表示结点个数
void createTree(LPtree &T) //create tree(need to use &)创建二叉搜索树
{
T=Node(a[k++]); //a[]为结点按顺序输入的数组
LPtree p=T; //一定要先创建根结点,在用指针指向
while(k<n) //每次插入结点都从根结点开始判断
{
if(a[k]<p->data) //小于
{
if(p->Lchild==NULL)
{ p->Lchild=Node(a[k++]);p=T; } //leftTree
else
p=p->Lchild;
}
else if(a[k]>p->data) //大于
{
if(p->Rchild==NULL)
{ p->Rchild=Node(a[k++]);p=T; } //rightTree
else
p=p->Rchild;
}
}
}
由先序序列和后序序列创建二叉树,并判断该树是否唯一
bool unique=true; //是否唯一
void makenode(LPtree &T,int h1,int h2,int l)
{
if(l==0) return ;
T=Node(pre[h1]); //创建根结点
if(l==1) return ;
int i;
for(i=h2;i<h2+l;i++) //确定左子树的范围
if(post[i]==pre[h1+1])
break;
int l1=i-h2+1; //左子树长度
int l2=l-1-l1; //右子树长度
if(l2==0) unique=false;
makenode(T->Lchild,h1+1,h2,l1); //递归构建左子树
makenode(T->Rchild,h1+1+l1,i+1,l2); //递归构建右子树
}