本文对普通树采用顺序存储结构
输入格式:
图片来源:
以下为普通树转二叉树完整代码:
#include<stdio.h>
#include<malloc.h>
#define MaxSize 50
typedef struct TreeNode
{
char data;
struct TreeNode* left_firstchild;
struct TreeNode* nextsibiling;
}TreeNode,*BinTreeNode;
typedef struct
{
char data;
int parent;
}NorTreeNode;
BinTreeNode ConstructTree(NorTreeNode* p,int num)
{
BinTreeNode Root,cur_node;
Root = NULL; // 根节点
TreeNode* brr[num]; // 指针数组,存放节点
for(int j=0;j<num;j++)
{
cur_node = (BinTreeNode)malloc(sizeof(TreeNode)); // 申请新节点
cur_node->data = p[j].data; // 复制data
cur_node->left_firstchild = cur_node->nextsibiling = NULL;
brr[j] = cur_node; // 将节点指针存入数组
if(Root == NULL) { Root = cur_node; }
}
for(int i=0;i<num-1;i++)
{
// 寻找第一个孩子节点
for(int k=i+1;k<num;k++)
{
if(i == p[k].parent)
{
brr[i]->left_firstchild = brr[k]; // 父节点连接孩子节点
break;
}
}
// 寻找第一个兄弟节点
for(int k=i+1;k<num;k++)
{
if(p[i].parent == p[k].parent)
{
brr[i]->nextsibiling = brr[k]; // 连接兄弟节点
break;
}
}
}
return Root;
}
void PreorderVisit(BinTreeNode RooT)
{
if(RooT != NULL)
{
printf("%c",RooT->data);
PreorderVisit(RooT->left_firstchild);
PreorderVisit(RooT->nextsibiling);
}
}
int main()
{
NorTreeNode arr[MaxSize];
BinTreeNode root;
int n;
printf("Number of nodes: \n");
scanf("%d",&n);
getchar(); // 接收回车键
for(int i=0;i<n;i++)
{
scanf("%c %d",&arr[i].data,&arr[i].parent);
getchar();
}
root = ConstructTree(arr, n);
PreorderVisit(root);
return 0;
}
该代码在Code::Blocks 20.03中测试通过
如有错误,恳请各位批评指正!