数据结构那些小事 求教大虾~~ 关于二叉树的!
根据已知的二叉树先序序列和中序序列 还原二叉树! 想知道递归的方法 ···

程序代码:#include<stdio.h>
#include<malloc.h>
//结点定义
typedef struct _node
{
int value;
struct _node *left;
struct _node *right;
} NODE;
//生成结点
NODE * newNode()
{
NODE * p;
p = (NODE *)malloc(sizeof(NODE));
if(p == NULL) return NULL;
p->value = 0;
p->left = NULL;
p->right = NULL;
return p;
}
//销毁结点
void disposeNode(NODE * p)
{
free(p);
}
//销毁树
void disposeTree(NODE * root)
{
if(root->left != NULL) disposeTree(root->left);
if(root->right != NULL) disposeTree(root->right);
disposeNode(root);
}
//根据先序与中序遍历结果重建树
// preorder: 先序遍历结果数组
// inorder: 中序遍历结果数组
// len: 数组的长度
// 返回值: 指向树根结点的指针
NODE * buildTree(int * preorder, int * inorder, int len)
{
int i;
NODE * root;
if(len <= 0) return NULL;
root = newNode();
root->value = preorder[0];
for(i = 0; i < len && inorder[i] != preorder[0]; i++);
if(i == len) return NULL;
root->left = buildTree(preorder + 1, inorder, i);
root->right = buildTree(preorder + i + 1, inorder + i + 1, len - i - 1);
return root;
}
void subShowTree(NODE * root, int deep)
{
int i;
if(root == NULL) return;
printf("%-5d", root->value);
if(root->right != NULL) subShowTree(root->right, deep + 1);
if(root->left != NULL)
{
printf("\n");
for(i = 0; i < deep; i++) printf(" ");
printf("+ ");
subShowTree(root->left, deep + 1);
}
}
//打印树的结构
//结果中某一元素右侧的值为它的右子结点的值,其正对下方的+号右侧的值为它的左子结点的值
void showTree(NODE * root)
{
subShowTree(root, 0);
}
int main()
{
int preorder[] = {1, 2, 4, 5, 7, 3, 6};
int inorder[] = {4, 2, 7, 5, 1, 3, 6};
NODE * tree;
tree = buildTree(preorder, inorder, 9);
showTree(tree);
disposeTree(tree);
return 0;
}

给力啊!!! O(∩_∩)O哈哈~ 虽然介个程序写得有点复杂··不过基本思路 已经理解了·· ·
程序代码:#define EL 10
#define TEL 2*EL+1
#define LEN sizeof(struct node)
#include<stdio.h>
#include<stdlib.h>
char pre[TEL]="abdhiecfg";
char pin[TEL]="hdibeafcg";
typedef struct node{
char data;
struct node * lch,*rch;
}BTNode,*BTree;
BTNode root;
BTree rt=&root;
int pos(char c,char s[],int st){
char *p;
p=s+st;
while(*p!=c && *p!='\0')
p++;
return p-s;
}
void create(BTree *t,int i1,int i2,int len){
int r,llen,rlen;
if(len<=0)
*t=NULL;
else{
*t=(BTree)malloc(LEN);
(*t)->data=pre[i1];
r=pos(pre[i1],pin,i2);
llen=r-i2;
rlen=len-(llen+1);
create(&(*t)->lch,i1+1,i2,llen);
create(&(*t)->rch,i1+llen+1,r+1,rlen);
}
}
void travel(BTree t){
if(t){
travel(t->lch);
travel(t->rch);
putchar(t->data);
}
}
void main(){
create(&rt,0,0,EL);
if(rt)
travel(rt);
printf("\n");
}