106 根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal
题解思路:
1.后序遍历的最后一个肯定是根节点
2.在中序遍历中找到根节点,根节点左边的就是左子树,根节点右边的就是右子树
3.利用递归思路遍历
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
//在中序遍历数组中找到根节点的位置
int find_tree(int* inorder, int inorderSize,int val)
{
int i = 0;
for(i=0;i<inorderSize;i++)
{
if(inorder[i] == val)
return i;
}
return 0;
}
struct TreeNode* buildTree(int* inorder, int inorderSize, int* postorder, int postorderSize){
if(inorderSize == 0 || postorderSize == 0)
{
return NULL;
}
else
{
//创建根节点
struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));
//根节点的值是后续遍历的最后一个
newNode->val = postorder[postorderSize-1];
//根节点在中序遍历中的位置
int pos_tree = find_tree(inorder,inorderSize,newNode->val);
//递归,使用根节点左边的数据构建左子树
newNode->left = buildTree(inorder,
pos_tree,
postorder,
pos_tree);
//递归,使用根节点右边的数据构建右子树
newNode->right = buildTree(inorder+pos_tree+1,
inorderSize-pos_tree-1,
postorder+pos_tree,
inorderSize-pos_tree-1);
return newNode;
}
}