标签:char* data strong 函数 ati 注意 turn 前序遍历 logs
// 树的结点的结构: struct TreeNode{ TreeNode* LChild; TreeNode* RChild; char data; };
注意: 求第三种序列必须有中序序列,比如前中求后 以及 中后求前,不可以前后求中
第一种情况:有前序序列和中序序列,求后序序列
前序: GDAFEMHZ 中序:ADEFGHMZ 需求得后序:AEFDHZMG
思路:利用递归解决.有一个函数
TreeNode* find_post_order(char* inOrder, char* preOrder, int length);
他的作用是: 在有一个中序和前序序列,以及这序列的长度(2者的长度当然一样)前提下,求后序序列
以所给的序列为例子:(前序: GDAFEMHZ 中序:ADEFGHMZ)
对于左子树,中序序列起始指针无需改变,靠length控制长度即可 但是左子树的前序序列需要 + 1,即去掉根结点 左子数的长度即是前序序列中根结点所在的index
对于右子树,中序序列的指针位置是原本的中序序列指针起始位置+rootIndex + 1,即上面的注中的H的位置
至于前序序列,因为前序遍历是 根->左->右, 所以右子树的前序序列是原本前序序列的指针位置 + 1 + rootIndex 即跃过了根,再跃过左子书的前序部分
至于长度,其实就是中序序列中, length - (rootIndex + 1), 其中rootIndex + 1代表包括根节点以前的部分的长度(即注中ADEFG部分的长度
当对左右子树都建立完,返回根节点指针即可
TreeNode* find_post_order(char* inOrder, char *preOrder, int length){ if(length == 0) return NULL; int rootIndex; for(rootIndex = 0; rootIndex < length; ++rootIndex){ if(inOrder[rootIndex] == *preOrder) break; } // 求前序序列的第一个结点(即root结点)在中序序列中的坐标 TreeNode *rootNode = new TreeNode; rootNode->data = *preOrder; //LEFT SubTree 注意子树中序, 前序的起始地点以及起到控制作用的序列长度 rootNode->LChild = find_post_order(inOrder, preOrder + 1, rootIndex); //RIGHT SubTree rootNode->RChild = find_post_order(inOrder + rootIndex + 1, preOrder + rootIndex + 1,length - (rootIndex + 1)); cout<<rootNode->data <<" "; //最终输出 root结点 return rootNode; }
同理推理,根据中序和后序求取前序序列
可以假设中序为 ADEFGHMZ 后序为 AEFDHZMG 需求得后序为 GDAFEMHZ
以后序的最后一个元素(即根)切割中序序列结果为
中序 ADEF G HMZ
后序 AEFDHZM G
TreeNode* find_pre_order(char* inOrder, char* postOrder, int length){ if(length == 0) return NULL; int rootIndex; for(rootIndex = 0; rootIndex < length; ++rootIndex){ if(inOrder[rootIndex] == *(postOrder + length - 1)) break; } TreeNode *rootNode = new TreeNode; rootNode->data = *(postOrder + length - 1); cout<<rootNode->data <<" "; rootNode->LChild = find_pre_order(inOrder, postOrder, rootIndex); rootNode->RChild = find_pre_order(inOrder + rootIndex + 1, postOrder + rootIndex, length - (rootIndex + 1)); return rootNode; }
标签:char* data strong 函数 ati 注意 turn 前序遍历 logs
原文地址:http://www.cnblogs.com/Rosebud/p/7352137.html