利用左孩子右兄弟的思想,将第一个孩子置为二叉树的左孩子,将节点的右兄弟置为右孩子。
如下一棵树:
转换为二叉树后应是:
#include<iostream>
#include<string>
#include<new>
using namespace std;
#define MAXSIZE 100
typedef struct TreeNode{//左孩子右兄弟类型的二叉树结构体
char data;
struct TreeNode *child,*bro;
}*CSTree,CSNode;
void createCStree(CSTree &T,char vdata[],int degree[],int n){//将树创建成二叉树,将树T,各节点的值vdata,各节点的度degree和节点数n传参并返回树T
CSTree pointer=new CSNode[MAXSIZE];//声明一个二叉树类型的节点数组
int k=0,d;
for(int i=0;i<n;i++){//初始化每个节点,并将左孩子和右兄弟置空
pointer[i].data=vdata[i];
pointer[i].child=pointer[i].bro=NULL;
}
for(int i=0;i<n;i++){ //遍历所有节点
d=degree[i]; //记录当前节点的度
if(d){ //度不为0时
k++; //指针k指向节点的第一个孩子
pointer[i].child=&pointer[k];//将指针指向的节点赋给前节点的左孩子
for(int j=2;j<=d;j++){ //用j去计数遍历前节点的孩子节点,也就是k节点兄弟结点
k++; //指针k指向k的右兄弟节点
pointer[k-1].bro=&pointer[k];//将k的左兄弟的右兄弟指针指向k节点
}
}
}
T=&pointer[0];//T指向新构建的二叉树
}
void preputtree(CSTree T){//先序输出二叉树的节点,用栈的思想,递归
if(T==NULL)return;
else{ //先输出当前遍历到的节点,在递归调用左孩子,最后调用右兄弟
printf("%c",T->data);
preputtree(T->child);
preputtree(T->bro);
}
}
int main(){
CSTree T;
char vdata[MAXSIZE]; //节点的值
int degree[MAXSIZE]; //各节点的度
int n; //节点数目n
cin>>n;
for(int i=0;i<n;i++){
cin>>vdata[i]>>degree[i];
}
createCStree(T,vdata,degree,n);
preputtree(T);
}
遇事不决,可问春风