根据两种不同遍历结果重构二叉树
2016-10-08 10:42
585 查看
leetcode原题:题目1 题目2
这里假设给的遍历都有中序遍历,我们先根据先序遍历或后序遍历找到根结点的值,然后据此可判断,在中序遍历的结果向量中,在根节点之前的部分数组组成它的左子树,根节点之后组成它的右子数。采用深度递归dfs。
题1:已知中序和后序遍历结果
题2:已知中序和前序遍历结果
这里假设给的遍历都有中序遍历,我们先根据先序遍历或后序遍历找到根结点的值,然后据此可判断,在中序遍历的结果向量中,在根节点之前的部分数组组成它的左子树,根节点之后组成它的右子数。采用深度递归dfs。
题1:已知中序和后序遍历结果
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { TreeNode* dfs(int post, int instart, int inend,vector<int>& inorder, vector<int>& postorder) { if(post<0||instart>inend) return NULL; TreeNode* root=new TreeNode(postorder[post]); int index=0; for(int i=instart;i<=inend;i++) if(inorder[i]==postorder[post]) { index=i; break; } TreeNode* left=dfs(post-(inend-index)-1,instart,index-1,inorder,postorder); TreeNode* right=dfs(post-1,index+1,inend,inorder,postorder); root->left=left; root->right=right; return root; } public: TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { int n=postorder.size(); return dfs(n-1,0,n-1,inorder,postorder); } };
题2:已知中序和前序遍历结果
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { TreeNode * dfs(int preStart, int inStart, int inEnd, vector<int>& preorder, vector<int>& inorder) { if(preStart>preorder.size()-1||inStart>inEnd) return NULL; TreeNode* root=new TreeNode(preorder[preStart]); int index=0; for(int i=inStart;i<=inEnd;i++) if(inorder[i]==preorder[preStart]) { index=i;break;} TreeNode* left=dfs(preStart+1,inStart,index-1,preorder,inorder); TreeNode* right=dfs(preStart+index-inStart+1,index+1,inEnd,preorder,inorder); root->left=left; root->right=right; return root; } public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { return dfs(0,0,inorder.size()-1,preorder,inorder); } };
相关文章推荐
- 根据中序遍历结果和前序(后序)遍历结果重构二叉树
- 根据中序遍历结果和前序(后序)遍历结果重构二叉树
- 算法面试:根据前序遍历结果序列和中序遍历结果序列重构二叉树
- 二叉树问题-根据前序遍历结果和中序遍历结果得出后序遍历结果
- 重建二叉树---根据前序和中序遍历结果重建二叉树
- 根据二叉树前序遍历和中序遍历的结果,重建出该二叉树并后序遍历之 java代码
- 根据前序和中序遍历的结果建立二叉树
- 根据前序遍历和中序遍历结果重建二叉树(递归方法)
- 根据遍历结果,构造二叉树
- 根据前序和中序遍历结果重建二叉树
- 二叉树的建立(根据遍历结果构建)、遍历(非递归)和搜索
- 3.9已知二叉树的 前序遍历和中序遍历的结果,重构出原二叉树
- 编程之美--根据遍历结果重建二叉树
- 根据二叉树的前序遍历和中序遍历的结果重建出该二叉树
- 根据前序和中序遍历结果重建二叉树
- [c++]已知二叉树的前序遍历与中序遍历结果(二叉树中不含重复数字),重构二叉树
- 根据二叉树遍历的结果重构二叉树
- 根据二叉树中序和后序(先序)遍历结果 重建二叉树
- 二叉树根据前序遍历和中序遍历重构确定唯一二叉树
- 二叉树——根据遍历结果,画出对应的二叉树 转载至:http://canlynet.blog.163.com/blog/static/255013652009112602449178/