长沙网站开发在线咨询,自己制作网页查询系统,红桥天津网站建设,怎么在自己做的网站上发视频教程题目描述
106. 从中序与后序遍历序列构造二叉树
中等
1.1K
相关企业
给定两个整数数组 inorder 和 postorder #xff0c;其中 inorder 是二叉树的中序遍历#xff0c; postorder 是同一棵树的后序遍历#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入#xff1…题目描述
106. 从中序与后序遍历序列构造二叉树
中等
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(vectorint inorder,vectorint 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(;indexinorder.size();index){if(inorder[index]val){break;}}//postorder.size()inorder.size()if(postorder.size()1){return root;}postorder.resize(postorder.size()-1);//左闭右开区间 区间端点就是函数参数vectorint leftinorder(inorder.begin(),inorder.begin()index);vectorint rightinorder(inorder.begin()index1/*1就是将中序的根节点舍弃掉*/,inorder.end());vectorint leftpostorder(postorder.begin(),postorder.begin()leftinorder.size());vectorint rightpostorder(postorder.begin()leftinorder.size(),postorder.end());//递归调用root-leftfunc1(leftinorder,leftpostorder);root-rightfunc1(rightinorder,rightpostorder);return root;}TreeNode* buildTree(vectorint inorder, vectorint postorder) {if(inorder.size()0||postorder.size()0)//特殊条件的判断{return nullptr;}return func1(inorder,postorder);}
};
递归调用部分
需要对递归有一点了解 不然你就在纸上走读代码 去画递归展开图
调用左树就执行到底之后再进左树调用中的右树调用 再进右树调用还是先执行左树调用再执行右树调用 因为左树调用在右树调用的前面