一、105-Given preorder and inorder traversal of a tree, construct the binary tree.
思路简单,但是实现起来就复杂了。
思路:发现,前序的第一个为根,然后在中序中找到根,在中序中,根的左边是左子树,右边是右子树。然后递归进入左子树与右子树。
可是由于在左子树的时候,坐标会错位,没办法对齐,纠结了很久,还是无法解决。最后求助于强大的百度……发现了大神解决的思路。
说到底也很简单,就是用两个不同的坐标来分别指示前序和后序。
代码:
/**
* 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 {
public:
void insert(vector<int>& preorder, vector<int>& inorder,TreeNode *& tree,int preN, int inN, int len)
{
if(len <= 0)//检验边界条件
{
tree = NULL;
return;
}
int i;
for( i=0; i < len; i++)//寻找中序遍历中的根节点位置
{
if(inorder[inN+i] == preorder[preN])
{
break;
}
}
tree = new TreeNode(preorder[preN]);
insert(preorder, inorder, tree->left, preN+1, inN, i);
insert(preorder, inorder, tree->right, preN+i+1, inN+i+1, len-1-i);
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int l=preorder.size();
TreeNode *root;
insert(preorder, inorder,root, 0, 0, l);
return root;
}
二、106-Given inorder and postorder traversal of a tree, construct the binary tree.
与上一题类似。
只是将前序换成了后序。后序的最后一个是根。然后找到跟在中序的位置,位置左边是左子树,右边是右子树。然后递归。
采用上题中的解决办法,采用两个坐标,分别指示在中序和后序中的位置。
代码:
/**
* 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 {
public:
TreeNode* build(vector<int>& inorder, vector<int>& postorder, TreeNode* &tree, int inN, int posN, int len)
{
if( len <= 0)
{
tree = NULL;
return NULL;
};
int i;
for( i=0; i < len; i++)
{
if( inorder[inN+i] == postorder[posN])//寻找根节点
break;
}
tree = new TreeNode(postorder[posN]);//插入根节点
build(inorder, postorder, tree->left, inN, posN-(len-i), i);//递归左子树
build(inorder, postorder, tree->right, inN+i+1, posN-1, len-i-1);//递归右子树
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
int len = inorder.size();
TreeNode* tree=NULL;
build(inorder, postorder, tree, 0, len-1, len);
return tree;
}
};