#include <stdio.h>
#include <cstdio>
#include <stack>
#include <malloc.h>
#include <iostream>
#define listnodemax 50
#define treemax 10
#define treenodemax 10
using namespace std;
typedef char datatype;
struct btreenode {
btreenode *llink, *rlink;
datatype data;
};
typedef btreenode * btree;
struct treenode {
treenode * childnode[treenodemax];
datatype data;
int amount;
};
typedef treenode * tree;
//初始化二叉树结点
void createbtreenode(btree& q)
{
q = (btree)malloc(sizeof(btreenode));
q->data = NULL;
q->rlink = q->llink = NULL;
}
//初始化树结点
void createtreenode(tree & q)
{
q = (tree)malloc(sizeof(treenode));
q->data = NULL;
q->amount = 0;
for(int i = 0; i < treenodemax; i++)
{
q->childnode[i] = NULL;
}
}
//建立树
void Createtree(tree mytree)
{
tree p, q;
stack<tree> mytreenode;
char a[listnodemax];
int flag = 0;
gets_s(a);
p = mytree;
mytreenode.push(p);
for (int i = 0; a[i] != '\0'; i++)
{
if (a[i] == '(')
flag = 0;
else if(a[i] == ',')
flag = 1;
else if (a[i] == ')')
{
mytreenode.pop();
}
else
{
createtreenode(q);
q->data = a[i];
if (flag == 0)
{
p = mytreenode.top();
p->childnode[p->amount] = q; p->amount++;
mytreenode.push(q);
}
if (flag == 1)
{
mytreenode.pop();
p = mytreenode.top();
p->childnode[p->amount] = q;p->amount++;
mytreenode.push(q);
}
}
}
}
//建立森林
void Createforest(int n, tree forest[])
{
int i;
for (i = 1; i <= n; i++)
{
cout << "请输入树: ";
createtreenode(forest[i]);
Createtree(forest[i]);
}
}
//树转化为二叉树//建立二叉树
void tree2btree(tree mytree, btree mybtree)
{
int flag=0;
stack<int> amountindex;
stack<tree> treenodeindex;
tree p=mytree->childnode[0]; btree q=mybtree ,q_;
q->data = p->data;
amountindex.push(p->amount); treenodeindex.push(p);
while(!amountindex.empty()&&amountindex.top()!=0)
{
int i = p->amount - amountindex.top();
createbtreenode(q_);
q_->data = p->childnode[i]->data;
if(flag == 0) q->llink = q_;
if (flag == 1) q->rlink = q_;
amountindex.top()--;
if (amountindex.top() == 0)
{
amountindex.pop();
treenodeindex.pop();
if (!amountindex.empty())
p = treenodeindex.top();
flag = 1;
}
else if (p->childnode[i]->amount != 0)
{
p = p->childnode[i];
amountindex.push(p->amount); treenodeindex.push(p);
flag = 0;
q = q_;
}
else
{
flag = 1;
q = q_;
}
}
}
//建立二叉森林
void Createbforest(int n, tree forest[],btree bforest[])
{
int i;
for (i = 1; i <= n; i++)
{
createbtreenode(bforest[i]);
tree2btree(forest[i], bforest[i]);
}
}
//多棵二叉树合并
void treecombine(int n, btree bforest[])
{
btree p = bforest[n ];
for (int i = n - 1; i >0; i--)
{
bforest[i]->rlink = p;
bforest[i + 1] = NULL;
p = bforest[i];
}
}
//二叉树分离
int btreeseparate(btree bforest[])
{
btree p = bforest[1] ;
int i = 1;
while (p->rlink != NULL)
{
i++;
//createlistnode(q);//头结点
bforest[i] = p->rlink;
p->rlink = NULL;
p = bforest[i];
}
return i ;
}
stack <btree> mybtreenode;
stack <tree> mytreenode;
//先序转化
void btreenode2treenode(btree p, btree p_, tree q, tree q_, int &flag)
{
if(mybtreenode.top() != NULL)
{
p = mybtreenode.top(); q = mytreenode.top();
createtreenode(q_);
q_->data = p->data;
q->childnode[q->amount] = q_;
q->amount++;
//if (flag == 0)
p_ = p;
flag = 0; p = p_->llink;
mybtreenode.push(p);mytreenode.push(q_);
btreenode2treenode(p,p_,q,q_,flag);
mytreenode.pop();
flag = 1; p = p_->rlink;
mybtreenode.push(p);// mytreenode.push(q_);
btreenode2treenode(p, p_, q, q_, flag);
}
mybtreenode.pop();
}
//二叉树转化为树
void btree2tree(tree mytree, btree mybtree)
{
btree p = mybtree, p_ = mybtree;//p_为p的父节点
tree q = mytree, q_ =mytree; //q_新节点
int flag = 0;
mybtreenode.push(p); mytreenode.push(q);
btreenode2treenode(p, p_, q, q_, flag );
}
//二叉森林转化为森林
void bforest2forest(int n, tree forest[], btree bforest[])
{
int i;
for (i = 1; i <= n; i++)
{
btree2tree(forest[i], bforest[i]);
}
}
//先序遍历
void PreOrderRec(btree list)
{
if (list != NULL)
{
cout << list->data;
PreOrderRec(list->llink);
PreOrderRec(list->rlink);
}
}
int main()
{
int n;//树的数目
tree forest[treemax];
btree bforest[treemax];
cout << "请输入树的数目: ";
cin >> n; getchar();
Createforest(n, forest);
Createbforest(n, forest, bforest);
for (int i = 1; i <= n; i++)
{
free(forest[i]);
createtreenode(forest[i]);
}
treecombine(n, bforest);
PreOrderRec(bforest[1]); cout << endl;
n = btreeseparate(bforest);
for (int i = 1; i <= n; i++) {
PreOrderRec(bforest[i]);
cout << endl;
}
bforest2forest(n, forest, bforest);
return 0;
}
输入:
(A(B,C,D))
(E(F))
(G(H(I),J))