二叉树前序、中序和后序遍历相互求法
2016-04-05 16:32
387 查看
假设已知一个二叉树,其前序遍历为1,2,4,7,3,5,6,8;中序遍历为4,7,2,1,5,3,8,6;后序遍历为7, 4, 2, 5, 8, 6, 3, 1。
在已知前序遍历和中序遍历或者是中序遍历和后序遍历两者时,其二叉树顺序是确定的,即另一遍序方式是确定的。
在求解过程中,首先需要确定根节点(前序遍历的第一个点为根节点,后序遍历最后一个点为根节点),然后再在中序遍历中寻找根节点,故而确定左右子树,最后利用递归的方式即可得出结果。
在已知前序遍历和中序遍历或者是中序遍历和后序遍历两者时,其二叉树顺序是确定的,即另一遍序方式是确定的。
在求解过程中,首先需要确定根节点(前序遍历的第一个点为根节点,后序遍历最后一个点为根节点),然后再在中序遍历中寻找根节点,故而确定左右子树,最后利用递归的方式即可得出结果。
#include <iostream> #include <vector> using namespace std; struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }*TNode; //已知前序和中序 struct TreeNode* reConstructBinaryTreePre(vector<int> pre, vector<int> in); //已知中序和后序 struct TreeNode* reConstructBinaryTreePost(vector<int> in, vector<int> post); void PostOrderTraverse(TreeNode *rt); void PreOrderTraverse(TreeNode *rt); int main() { int ppre[] = {1,2,4,7,3,5,6,8}; int iin[] = {4,7,2,1,5,3,8,6}; int ppos[] = {7, 4, 2, 5, 8, 6, 3, 1}; vector<int> pre; vector<int> in; vector<int> post; for(int i = 0; i < 8; i++) { pre.push_back(ppre[i]); in.push_back(iin[i]); post.push_back(ppos[i]); } cout << "后序遍历:" << endl; TNode = reConstructBinaryTreePre(pre, in); PostOrderTraverse(TNode); cout << endl; cout << "前序遍历:" << endl; TNode = reConstructBinaryTreePost(in, post); PreOrderTraverse(TNode); cout << endl; return 0; } //后序遍历 void PostOrderTraverse(TreeNode *rt) { if(rt != NULL) { PostOrderTraverse(rt -> left); PostOrderTraverse(rt -> right); cout << rt -> val; } } //前序遍历 void PreOrderTraverse(TreeNode *rt) { if(rt != NULL) { cout << rt -> val; PreOrderTraverse(rt -> left); PreOrderTraverse(rt -> right); } } //已知前序遍历和中序遍历,重建二叉树 struct TreeNode* reConstructBinaryTreePre(vector<int> pre,vector<int> in) { TreeNode* post = (TreeNode*)malloc(sizeof(struct TreeNode)); int len = pre.size(); if(len <= 0) return NULL; post -> val = pre[0]; vector<int>::iterator iter = find(in.begin(), in.end(), pre[0]); vector<int> lpre(pre.begin() + 1, pre.begin() + (iter - in.begin()) + 1); vector<int> lin(in.begin(), iter); post -> left = reConstructBinaryTreePre(lpre, lin); vector<int> rpre(pre.begin() + (iter - in.begin()) + 1, pre.end()); vector<int> rin(iter + 1, in.end()); post -> right = reConstructBinaryTreePre(rpre, rin); return post; } //已知中序遍历和后序遍历,构建二叉树 struct TreeNode* reConstructBinaryTreePost(vector<int> in, vector<int> post) { TreeNode* pre = (TreeNode*)malloc(sizeof(struct TreeNode)); int len = in.size(); if(len <= 0) return NULL; pre -> val = post[len - 1]; vector<int>::iterator iter = find(in.begin(), in.end(), post[len - 1]); vector<int> lin(in.begin(), iter); vector<int> lpost(post.begin(), post.begin() + (iter - in.begin()) + 1); pre -> left = reConstructBinaryTreePost(lin, lpost); vector<int> rin(iter + 1, in.end()); vector<int> rpost(post.begin() + (iter - in.begin()), post.end() - 1); pre -> right = reConstructBinaryTreePost(rin, rpost); return pre; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- AVL树-自平衡二叉查找树(Java实现)
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 文件遍历排序函数
- Lua 学习笔记之C API 遍历 Table实现代码
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#中遍历Hashtable的4种方法
- C++联合体转换成C#结构的实现方法
- Erlang中遍历取出某个位置的最大值代码
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题