前段时间看了《编程之美》,这几天在看《剑指offer》,感觉写的不是很美。他们的代码感觉思路不是很容易读出来,我就顺手自己写了个。
我的思路大概就是按照先序遍历建树的,以题目中先序的的数组遍历添加到重建的二叉树中,以中序遍历和先序遍历的数组判断子节点是否为空。
Talk is cheap,show you the code
#include <stdio.h>
#include <stdlib.h>
#define OVERFLOW -2
#define OK 1
#define QElemType BiTNode
#define TRUE 1
#define FALSE 0
#define ERROR 0
typedef int Status;
typedef char ElemType;
typedef struct BiTNode // 结点结构
{
ElemType data;
struct BiTNode *lchild, *rchild;
// 左右孩子指针
} BiTNode, *BiTree;
char a[]={'a','b','d','c','e','f'};
char b[]={'d','b','a','e','c','f'};
int a_len=sizeof(a);
int index(char c,int start,int end)
{
for(int i = start;i<end;i++)
{
if(c==b[i])
{
return i;
}
}
return -1;
}
Status Rebuild(BiTree &T,int &i,int start,int end)
{
if(i==a_len+1) return 0;
int position =index(a[i],start,end);
// printf("%d:%d %d %d\n",i,start,end,position);
if(position!=-1)
{
if ((T =(BiTNode *)malloc(sizeof(BiTNode)))==NULL) exit(OVERFLOW);
T->data = a[i]; // 生成根结点
i++;
Rebuild(T->lchild,i,start,position);
Rebuild(T->rchild,i,position,end);
}
else
{
T=NULL;
}
return 0;
}
Status PreOrderTraverse(BiTree T, Status(*visit)(ElemType&))
{
//T为树根的指针,先序遍历
if (T)
{
visit(T->data); // 访问结点
PreOrderTraverse(T->lchild, visit);
PreOrderTraverse(T->rchild, visit);
}
}
Status print(ElemType &c)
{
printf("%c ",c);
}
int main(int argc, char const *argv[])
{
BiTree t;
int i=0;
int start = 0;
int end = sizeof(b);
Rebuild(t,i,start,end);
PreOrderTraverse(t,print);
return 0;
}