面试算法—重建二叉树

来源:互联网 发布:上古世纪没人玩 知乎 编辑:程序博客网 时间:2024/05/22 19:39

前段时间看了《编程之美》,这几天在看《剑指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 0typedef 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;}


0 0
原创粉丝点击