一.题目
Construct Binary Tree from Inorder and Postorder Traversal
Total Accepted: 33418 Total Submissions: 124726My
Submissions
Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
Show Tags
Have you met this question in a real interview?
Yes
No
二.解题技巧
这道题和Construct Binary Tree from Preorder and Inorder Traversal类似,都是考察基本概念的,后序遍历是先遍历左子树,然后遍历右子树,最后遍历根节点。
做法都是先根据后序遍历的概念,找到后序遍历最后的一个值,即为根节点的值,然后根据根节点将中序遍历的结果分成左子树和右子树,然后就可以递归的实现了。
上述做法的时间复杂度为O(n^2),空间复杂度为O(1)。
三.实现代码
#include <iostream> #include <algorithm> #include <vector> /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ using std::vector; using std::find; struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; class Solution { private: TreeNode* buildTree(vector<int>::iterator PostBegin, vector<int>::iterator PostEnd, vector<int>::iterator InBegin, vector<int>::iterator InEnd) { if (InBegin == InEnd) { return NULL; } if (PostBegin == PostEnd) { return NULL; } int HeadValue = *(--PostEnd); TreeNode *HeadNode = new TreeNode(HeadValue); vector<int>::iterator LeftEnd = find(InBegin, InEnd, HeadValue); if (LeftEnd != InEnd) { HeadNode->left = buildTree(PostBegin, PostBegin + (LeftEnd - InBegin), InBegin, LeftEnd); } HeadNode->right = buildTree(PostBegin + (LeftEnd - InBegin), PostEnd, LeftEnd + 1, InEnd); return HeadNode; } public: TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { if (inorder.empty()) { return NULL; } return buildTree(postorder.begin(), postorder.end(), inorder.begin(), inorder.end()); } };
四.体会
这道题主要考察的是基本概念,并没有很复杂的算法在里面,可以算是对于二叉树的遍历的进一步理解。
版权所有,欢迎转载,转载请注明出处,谢谢
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-05 01:04:39