根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我这里是把容器转变成了数组来处理,写完之后发现还是直接用向量容器更方便
用递归的思路,先在先序遍历中找到当前树的头节点,然后去中序遍历中找到相同的值.
那么在中序遍历中这个值之前的元素都属于树的左子树,这个值之后的元素的都属于右子树
利用这个思路,写 一个函数,参数分别是先序遍历,中序遍历,还有当前树的节点个数(这个参数非常重要)
进而利用递归的思路解决问题
递归的出口是当前要构造的树的节点个数为0,具体的来说是没有左子树或者没有右子树,或者两者都没有
递归时传递给本函数的参数,动态的由先序遍历的首地址和中序遍历首地址以及左子树或者右子树的节点个数来决定
/**
* 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* CreatBT1(int* pre, int* in, int n)
{
TreeNode* b;
int *p;
int k ;
if(n <= 0)
{
return NULL;
}
//b = (TreeNode*)malloc(sizeof(TreeNode));
b = new TreeNode(*pre);
//return b;
//b->val = ;
for(p=in; p<in+n; p++)
{
if(*p == *pre)
break;
}
k = p-in;
b->left = CreatBT1(pre+1, in, k);
b->right = CreatBT1(pre+1+k, p+1, n-k-1);
return b;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
{
int n = preorder.size();
TreeNode* ret =NULL;
int *pre = new int[n];
if (!preorder.empty())
{
memcpy(pre, &preorder[0], n*sizeof(int));
}
int *in = new int[n];
if (!inorder.empty())
{
memcpy(in, &inorder[0], n*sizeof(int));
}
ret = CreatBT1(pre, in, n);
return ret;
}
};