IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 106. Construct Binary Tree from Inorder and Postorder Traversal -> 正文阅读

[数据结构与算法]106. Construct Binary Tree from Inorder and Postorder Traversal

题目:

Given two integer arrays?inorder?and?postorder?where?inorder?is the inorder traversal of a binary tree and?postorder?is the postorder traversal of the same tree, construct and return?the binary tree.

Example 1:

Input: inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
Output: [3,9,20,null,null,15,7]

Example 2:

Input: inorder = [-1], postorder = [-1]
Output: [-1]

Constraints:

  • 1 <= inorder.length <= 3000
  • postorder.length == inorder.length
  • -3000 <= inorder[i], postorder[i] <= 3000
  • inorder?and?postorder?consist of?unique?values.
  • Each value of?postorder?also appears in?inorder.
  • inorder?is?guaranteed?to be the inorder traversal of the tree.
  • postorder?is?guaranteed?to be the postorder traversal of the tree.

思路:

已知前序和后序数组建立树,比较经典的二叉树题目了。我们要掌握的基础知识:后序的最后一个数字即是根(题目保证每个数字不同),而根据后序的数字,假设为x,在中序数组中,x之前的子数组就是x的左子树的,假设长为len1;x之后的子数组就是右子树的,假设长为len2。在后序数组中,前len1个数字组成的子数组就是左子树的,而len1之后的len2个数字组成的子数组就是右子树的。掌握以上几点很重要,这使我们确认切割的点位。递归中,首先如果进来的两个数组是空的,那么就返回nullptr。然后开始正式建立树:1)以后序数组的最后一个数字建立root;2)切割中序数组,将其分为左右两段,分别是root数字的左侧子数组和右侧子数组;3)用中序数组的两个子数组长度切割后序子数组,这一过程中记得消去最后一个已经作为root的数字;4)向root的左右子树递归;5)返回root。总的来说在已知上面的基础知识情况下,只要小心数组的切割点位即可。

代码:

/**
?* 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* buildTree(vector<int>& inorder, vector<int>& postorder) {
? ? ? ? TreeNode* root = traversal(inorder, postorder);
? ? ? ? return root;
? ? }
private:
? ? TreeNode* traversal(vector<int> &inorder, vector<int> &postorder) {
? ? ? ? if (inorder.empty() || postorder.empty())
? ? ? ? ? ? return nullptr;
? ? ? ? TreeNode* root = new TreeNode(postorder.back());
? ? ? ? int cur = 0;
? ? ? ? for (; cur < inorder.size(); cur++) {
? ? ? ? ? ? if (inorder[cur] == root->val)
? ? ? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? vector<int> inorderleft(begin(inorder), begin(inorder) + cur);
? ? ? ? vector<int> inorderright(begin(inorder) + cur + 1, end(inorder));

? ? ? ? postorder.pop_back();
? ? ? ? vector<int> postorderleft(begin(postorder), begin(postorder) + inorderleft.size());
? ? ? ? vector<int> postorderright(begin(postorder) + inorderleft.size(), end(postorder));

? ? ? ? root->left = traversal(inorderleft, postorderleft);
? ? ? ? root->right = traversal(inorderright, postorderright);

? ? ? ? return root;
? ? }
};

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 08:20:57  更:2022-05-08 08:22:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:24:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码