文章标题
2016-07-22 10:30
253 查看
根据前序和中序遍历重建二叉树
给定中序遍历和后序遍历
class Solution { public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { if(preorder.size() == 0 || inorder.size() == 0) return NULL; int start = 0; int pend = preorder.size() - 1; int iend = inorder.size() - 1; return helper(preorder,0,pend,inorder,0,iend); } TreeNode* helper(vector<int> preorder,int pstart,int pend,vector<int> inorder,int istart,int iend){ if(pstart > pend || istart > iend) return NULL; int key = preorder[pstart]; TreeNode* root = new TreeNode(key); int count = 0; if(pstart == pend) return root; while (inorder[istart+count]!=key ) { count++; } int pleft_start = pstart+1; int pleft_end = pstart + count; int pright_start = pleft_end + 1; int pright_end = pend; int ileft_start = istart; int ileft_end = ileft_start + count - 1; int iright_start = ileft_end + 2; int iright_end = iend; root->left = helper(preorder,pleft_start,pleft_end,inorder,ileft_start,ileft_end); root->right = helper(preorder,pright_start,pright_end,inorder,iright_start,iright_end); return root; } };
给定中序遍历和后序遍历
class Solution { public: TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { if(postorder.size() == 0 || inorder.size() == 0) return NULL; int start = 0; int pend = postorder.size() - 1; int iend = inorder.size() - 1; return helper(postorder,0,pend,inorder,0,iend); } TreeNode* helper(vector<int>& postorder,int pstart,int pend,vector<int>& inorder,int istart,int iend){ if(pstart > pend || istart > iend) return NULL; int key = postorder[pend]; TreeNode* root = new TreeNode(key); int leftcount = 0; if(pstart == pend) return root; //求左子树个数 while (inorder[istart+leftcount]!=key ) { leftcount++; } //求右子树个数,总共的个数-左子树个数 int rightcount = iend - istart -leftcount ; //计算后序遍历的位置 int pright_start = pend - rightcount; int pright_end = pend -1; int pleft_start = pstart; int pleft_end = pstart + leftcount -1; //计算中序遍历的位置 int ileft_start = istart; int ileft_end = ileft_start + leftcount - 1; int iright_start = ileft_end + 2; int iright_end = iend; root->left = helper(postorder,pleft_start,pleft_end,inorder,ileft_start,ileft_end); root->right = helper(postorder,pright_start,pright_end,inorder,iright_start,iright_end); return root; } };
相关文章推荐
- Android应用开发SharedPreferences存储数据的使用方法
- Libevent学习:介绍与安装
- Scala数组操作
- Titan-红号楼宗谱案例
- 回车与换行的区别
- Java序列化的机制和原理
- ( 值得收藏) liunx 命令大全
- 51nod 1138 连续整数的和
- Android中Recyclerview使用7----条目中按钮点击事件,在activity中调用(接口回调)
- 在Ubuntu 14.04上安装Caffe
- 数位dp小结
- Mybatis实现自定义的typehandler三步曲
- android点击Button,使字体变色
- 和block循环引用说再见
- adb常用命令|修改build.porp文件
- MATLAB2012a_for_win7_64
- Jsp页面中双引号问题
- Android ListView滑动过程中图片显示重复错乱闪烁问题解决
- Android利用AsyncTask异步类实现网页内容放大缩小
- 基于BootStrap 的城市三级联动。