根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 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
注意:先序遍历和中序遍历是怎样的?如何进行切割?区间如何确定?
/**
* 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* traversal(vector<int>& preorder,int preorderBegin,int preorderEnd,vector<int>& inorder,int inorderBegin,int inorderEnd){
// 递归出口
if(preorderBegin==preorderEnd)return NULL;
// 还原当前节点
TreeNode* root=new TreeNode(preorder[preorderBegin]);
// 中序切割确定左右子树
int index=0;
for(index=inorderBegin;index<inorderEnd;index++){
if(preorder[preorderBegin]==inorder[index])break;
}
int leftInorderBegin=inorderBegin;
int leftInorderEnd=index;
int rightInorderBegin=index+1;
int rightInorderEnd=inorderEnd;
// 根据左右子树节点数量进行先序切割,注意第一个节点的特殊性
int leftPreorderBegin=preorderBegin+1;
int leftPreorderEnd=preorderBegin+(index-inorderBegin)+1;
int rightPreoederBegin=leftPreorderEnd;
int rightPreoederEnd=preorderEnd;
// 左子树递归还原
root->left=traversal(preorder,leftPreorderBegin,leftPreorderEnd,inorder,leftInorderBegin,leftInorderEnd);
// 右子树递归还原
root->right=traversal(preorder,rightPreoederBegin,rightPreoederEnd,inorder,rightInorderBegin,rightInorderEnd);
// 返回节点指针
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return traversal(preorder,0,preorder.size(),inorder,0,inorder.size());
}
};