二叉树的建立方法,你都懂吗?
二叉树是很简单,但是你真的会所有的建树方法吗?这里将会给你提供7种建树方法。
第一种:就是只利用先序建树,递归建树(但是先序必须是完整的,用#表示NULL)
第二种:利用先序传引用建树。
第三种:利用先序和二级指针建树。
第四种:给定某一个节点(这个节点是引用传进去)左右孩子。
第五种:给定某一个节点(这个节点是指针传进去)左右孩子。
第六种:用先序和中序建树
第七种:用中序和后序建树。
这里有基本的二叉树的操作:http://blog.csdn.net/qq_35256722/article/details/69111333
下面只是简单的代码:
第一种:
//创建一个二叉树
//只给一个先序和NULL来建立一个二叉树
BtNode *Createtree()
{
BtNode *p = NULL;
Elemtype x;
cin>>x;
if(x != '#')
{
p = BuyNode();
p->data = x;
p->leftchild = Createtree();
p->rightchild = Createtree();
}
return p;
}
第二种:
//传引用建树
BtNode *Createtree1(char *&str)
{
BtNode *p = NULL;
if( str != NULL && *str != '#')
{
p = BuyNode();
p->data = *str;
p->leftchild = Createtree1(++str);
p->rightchild = Createtree1(++str);
}
return p;
}
第三种:
//引用转换成二级指针建树
BtNode *Createtree2(char ** const str)
{
BtNode *p = NULL;
if( str != NULL && *str != NULL && **str != '#')
{
p = BuyNode();
p->data = **str;
p->leftchild = Createtree1(++*str);
p->rightchild = Createtree1(++*str);
}
return p;
}
第四种
//给一个结点建立左右孩子
void Createtree3(BtNode *&p,char *&str)
{
if( str != NULL && *str != '#')
{
p = BuyNode();
p->data = *str;
Createtree3(p->leftchild,++str);
Createtree3(p->rightchild,++str);
}
}
第五种:
//利用指针
void Createtree4(BtNode ** const p,char *&str)
{
if( str != NULL && *str != '#')
{
(*p) = BuyNode();
(*p)->data = *str;
Createtree4(&(*p)->leftchild,++str);
Createtree4(&(*p)->rightchild,++str);
}
}
第六种:
int Findvalue(char *is,Elemtype p,int n)
{
for(int i = 0;i < n;++i)
{
if(is[i] == p)
return i;
}
return -1;
}
//根据前序和中序建立一个二叉树
BtNode *CreatePM(char *pr,char *is,int n)
{
Elemtype p = pr[0];
BtNode *tmp = NULL;
if(n > 0)
{
int m = Findvalue(is,p,n);
if(-1 == m) exit(1);
tmp = BuyNode();
tmp->data = p;
tmp->leftchild = CreatePM(pr+1,is,m);
tmp->rightchild = CreatePM(pr+m+1,is+m+1,n-m-1);
}
return tmp;
}
BtNode *CreatetreePM(char *pr,char *is,int n)
{
if(pr == NULL || is == NULL || n < 1) return NULL;
return CreatePM(pr,is,n);
}
第七种:
BtNode *CreateML(char *mi,char *la,int n)
{
Elemtype p = la[n-1];
BtNode *tmp = NULL;
if(n > 0)
{
int m = Findvalue(mi,p,n);
if(-1 == m) exit(1);
tmp = BuyNode();
tmp->data = p;
tmp->leftchild = CreateML(mi,la,m);
tmp->rightchild = CreateML(mi+m+1,la+m,n-m-1);
}
return tmp;
}
BtNode *CreatetreeML(char *mi,char *la,int n)
{
if(mi == NULL || la == NULL || n < 1) return NULL;
return CreateML(mi,la,n);
}
期待更多的方法。