数据结构那些小事 求教大虾~~ 关于二叉树的!
根据已知的二叉树先序序列和中序序列 还原二叉树! 想知道递归的方法 ··· 
#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; }
#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"); }