面试算法—重建二叉树

前段时间看了《编程之美》,这几天在看《剑指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;
}
    原文作者:ls7972222
    原文地址: https://blog.csdn.net/ls7972222/article/details/37911131
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞