这是一个经常遇到的问题,今天再次遇到了,重新把它写一下。
(该图来自http://baike.baidu.com/view/1898358.htm)
如上图所示为一棵二叉树,其三种遍历的顺序依次为:
先序遍历:ABDECF
中序遍历:DBEAFC
求后序遍历。
思路:根据先序遍历,可以确立A为其根节点,中序遍历的序列中A左边的为其左子树,右边为其右子树,可以根据这一思路来进行二叉树的构建
关键点:左子树在中序遍历中为DBE在先序遍历中为BDE,即长度相等
可以结合字符串处理等相关的函数不难写出程序。
二叉树的数据结构:
1 typedef char ElementType; 2 struct NodeType; 3 typedef struct NodeType * TreePoint; 4 5 struct NodeType 6 { 7 ElementType nodeid; 8 TreePoint leftnode; 9 TreePoint rightnode; 10 };
处理函数:
1 void premidBuildtree(char* pre, char * mid, TreePoint root) 2 { 3 int len = strlen(pre); 4 5 if(len == 0) 6 { 7 return; 8 } 9 10 char *p = strchr(mid,pre[0]); 11 int pos = (int)(p-mid+1); 12 root->nodeid = pre[0]; 13 if(pos != 1) 14 { 15 TreePoint childleft = new NodeType; 16 root->leftnode = childleft; 17 childleft->nodeid = pre[1]; 18 childleft->leftnode = NULL; 19 childleft->rightnode = NULL; 20 char * leftprechar = new char[pos]; 21 char * leftmidchar = new char[pos]; 22 strncpy(leftprechar,pre+1,pos-1); 23 leftprechar[pos-1]='