根据前序遍历和中序遍历还原二叉树
来源:互联网 发布:程序员需要学什么语言 编辑:程序博客网 时间:2024/06/05 07:29
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */#include<assert.h>class Solution {public: struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) { if (pre.empty() || in.empty()||pre.size()!=in.size()) return NULL; int size = pre.size(); vector<int> left_pre,left_in,right_pre,right_in; TreeNode* root = new TreeNode(pre[0]); int i = 0; for(;i<size;i++) { if(in[i] == pre[0]) break; } if(i == size) assert(0); for(int j =0; j < i;j++) { left_in.push_back(in[j]); left_pre.push_back(pre[j+1]); } for(int j=i+1;j<size;++j) { right_in.push_back(in[j]); right_pre.push_back(pre[j]); } if(!left_in.empty()) { root->left = reConstructBinaryTree(left_pre,left_in); } if(!right_in.empty()) { root->right = reConstructBinaryTree(right_pre, right_in); } return root; }};
template<typename T>struct BinaryTreeNode{ BinaryTreeNode(T data) : _data(data) , _pLeft(NULL) , _pRight(NULL) {} T _data; BinaryTreeNode<T>* _pLeft; BinaryTreeNode<T>* _pRight;};
BinaryTree() :_proot(NULL){} BinaryTreeNode<T>* reConstructBinaryTree(char* prev, char * in, int len) { if (prev == NULL || in == NULL || len <= 0) return NULL; _proot = _reConstructBinaryTree(prev, prev + len - 1, in, in + len - 1); return _proot; }BinaryTreeNode<T>* _reConstructBinaryTree(char* prev, \ char* prev_end, char * in, char* in_end) { BinaryTreeNode<T>* root = new BinaryTreeNode<T>(prev[0]); if (prev == prev_end) { if (in == in_end&&*prev == *in) return root; else assert(0); } char* pin = in; while (pin <= in_end)//找到中序遍历的跟节点 { if (*pin == *prev) break; else { pin++; } } if (pin == in_end&& *pin != *prev) assert(0); int leftlength = pin - in; char *leftprevend = prev + leftlength; if (leftlength > 0)//构建左子树 { root->_pLeft = _reConstructBinaryTree(prev + 1, leftprevend, in, pin - 1); } if (leftlength < prev_end - prev)//构建右子树 { root->_pRight = _reConstructBinaryTree(leftprevend + 1, prev_end, pin + 1, in_end); } return root; }
最后简单说一下思路,很简单。
1.前序的第一个是根
2.中序里找到根,前面的是左子树,后面的是右子树
3.递归的对左子树和右子树进行上述操作,
注意递归出口
0 0
- 【二叉树】根据二叉树的中序遍历和前序遍历,还原二叉树
- 根据前序遍历和中序遍历还原二叉树
- 数据结构——根据前序遍历和中序遍历还原二叉树
- 根据二叉树的前序遍历和中序遍历(或者中序遍历和后序遍历)还原二叉树
- 根据前序和中序遍历还原二叉树后序遍历(hihocoder 1049)
- 根据前序遍历-中序遍历结果 来还原一颗二叉树
- 根据一个树的中序遍历和前序遍历数据,还原一个二叉树的思考
- 7-9 还原二叉树(25 point(s))(根据前序遍历和中序遍历建树)
- 根据前序和中序遍历构造二叉树
- 根据前序和中序遍历构造二叉树
- 根据中序和前序遍历重建二叉树
- 根据中序和前序遍历构建二叉树
- 根据前序和中序遍历重建二叉树
- 根据前序遍历,中序遍历构建二叉树
- 根据前序遍历、中序遍历重建二叉树
- 根据前序遍历中序遍历求二叉树
- 根据二叉树前序、中序遍历还原二叉树
- 根据前序遍历和后续遍历建立二叉树
- 第三章 数据和C(一)
- 深入理解PHP原理之PHP脚本执行原理(2)
- FPGA入门(1)——modelsim与quartus ii l联合
- 整型数组拼接最大数
- JS模块加载器加载原理是怎么样的?
- 根据前序遍历和中序遍历还原二叉树
- java中获取路径的方法
- storm的特性与使用场景
- 3232: 圈地游戏
- 【Apache Ant】ANT解析以及ANT在myEclipse中的使用
- 我的见解之hibernate(四)
- 播放骨骼动画
- 2016.8.23
- 内存分析工具MAT的使用