中等
1.1K
相关企业
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
示例 1:

输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3] 输出:[3,9,20,null,null,15,7]
示例 2:
输入:inorder = [-1], postorder = [-1] 输出:[-1]
提示:
1 <= inorder.length <= 3000postorder.length == inorder.length-3000 <= inorder[i], postorder[i] <= 3000inorder 和 postorder 都由 不同 的值组成postorder 中每一个值都在 inorder 中inorder 保证是树的中序遍历postorder 保证是树的后序遍历后续遍历:左 右 中
中序遍历:左 中 右
假设没有重复值的节点 如果有那就不会是种二叉树 你可以将重复节点挨个遍历 依次确定所有二叉树
那么后续排序就可以确定这颗二叉树的根节点 再在中序排序中找到该值(根节点)
将中序遍历分为三部分 左子树的中序遍历 根节点 右子树的中序遍历
将后序遍历分为三部分 左子树的后续遍历 右子树的后续遍历 根节点
经过上面的处理 不能形成一颗完整的二叉树 因为里面有左右子树还没有确定其根节点
那么就要再进行上 面的操作 直到将左右子树全部确定完毕
需要递归进行处理 也可以模拟递归 用栈去模拟递归
结合上面思路先大致想一想递归代码的实现
- /**//树的节点
- * Definition for a binary tree node.
- * struct TreeNode {
- * int val;
- * TreeNode *left;
- * TreeNode *right;
- * TreeNode() : val(0), left(nullptr), right(nullptr) {}
- * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
- * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
- * };
- */
- class Solution {
- public:
- TreeNode* func1(vector<int>& inorder,vector<int>& postorder)//递归
- {
- //postorder.size()==inorder.size()
- if(postorder.size()==0)
- {
- return nullptr;
- }
- int val = postorder[postorder.size()-1];
- TreeNode* root = new TreeNode(val);//创建节点
-
- int index = 0;//寻找中序的根节点
- for(;index
size();index++) - {
- if(inorder[index]==val)
- {
- break;
- }
- }
- //postorder.size()==inorder.size()
- if(postorder.size()==1)
- {
- return root;
- }
- postorder.resize(postorder.size()-1);
- //左闭右开区间 区间端点就是函数参数
- vector<int> leftinorder(inorder.begin(),inorder.begin()+index);
- vector<int> rightinorder(inorder.begin()+index+1/*+1就是将中序的根节点舍弃掉*/,inorder.end());
- vector<int> leftpostorder(postorder.begin(),postorder.begin()+leftinorder.size());
- vector<int> rightpostorder(postorder.begin()+leftinorder.size(),postorder.end());
-
- //递归调用
- root->left=func1(leftinorder,leftpostorder);
- root->right=func1(rightinorder,rightpostorder);
-
- return root;
-
- }
- TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
- if(inorder.size()==0||postorder.size()==0)//特殊条件的判断
- {
- return nullptr;
- }
- return func1(inorder,postorder);
- }
- };
需要对递归有一点了解 不然你就在纸上走读代码 去画递归展开图
调用左树就执行到底之后再进左树调用中的右树调用 再进右树调用还是先执行左树调用再执行右树调用 因为左树调用在右树调用的前面