题目:
Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
题目来源:https://oj.leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
解题思路:用递归,不断创建节点。
#include<iostream>
#include<queue>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
void buildTree(TreeNode *root,vector<int> &preorder,int first1,int last1, vector<int> &inorder,int first2,int last2)
{
if(first1>=last1)
return ;
int i=0;
while(inorder[first2+i]!=preorder[first1])
i++;
if(i>0)//证明有左子树
{
root->left=new TreeNode(preorder[first1+1]);
buildTree(root->left,preorder,first1+1,first1+i,inorder,first2,first2+i-1);
}
if(first2+i<last2)//证明有右子树
{
root->right=new TreeNode(preorder[first1+i+1]);//i到first2的距离为i-first2
buildTree(root->right,preorder,first1+i+1,last1,inorder,first2+i+1,last2);
}
}
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder)
{
TreeNode *root=NULL;
if(preorder.empty())
return root;
root=new TreeNode(preorder[0]);
buildTree(root,preorder,0,preorder.size()-1,inorder,0,inorder.size()-1);
return root;
}
int main()
{
const int N=3;
int A[N]={1,2,3};
int B[N]={2,3,1};
vector<int> preorder(A,A+N);
vector<int> inorder(B,B+N);
buildTree(preorder,inorder);
system("pause");
return 0;
}