每日一题:LeetCode-105.从前序遍历与中序遍历构造二叉树

这篇具有很好参考价值的文章主要介绍了每日一题:LeetCode-105.从前序遍历与中序遍历构造二叉树。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

每日一题系列(day 02)

前言:

🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈

   🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉算法👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!💪💪当然切记不可😈走火入魔😈,每日打怪,日日累积,终能成圣🙏🙏!今天就开启我们的斩妖之旅!✈️✈️

LeetCode-105.从前序与中序遍历序列构成二叉树:

题目:

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

示例1:

每日一题:LeetCode-105.从前序遍历与中序遍历构造二叉树,每日一题,leetcode,算法

示例2:

每日一题:LeetCode-105.从前序遍历与中序遍历构造二叉树,每日一题,leetcode,算法

注意事项:

  • 1 <= preorder.length <= 3000
  • inorder.length == preorder.length
  • -3000 <= preorder[i], inorder[i] <= 3000
  • preorder 和 inorder 均 无重复 元素
  • inorder 均出现在 preorder
  • preorder 保证 为二叉树的前序遍历序列
  • inorder 保证 为二叉树的中序遍历序列

解法:

  思路:

  我们在学习二叉树的时候,很早就会了使用前序和中序或者中序和后序的序列来还原一颗二叉树。找到根节点位置将根节点创建出来,用左右子树接收根节点左右子树的前中序遍历的结果。接着向左子树和右子树分别重复上述操作,就可以递归构建一颗二叉树、

  1、我们把前序遍历数组的左右子树给找出来,所以需要中序遍历的结果来,用pos作为下标,只要中序遍历数组的值不等于前序遍历数组的第一个值,pos就++,最后得到的pos就是根节点。
  2、创建根节点,将前序遍历的第一个数组放入根节点。
  3、使用两个临时数组分别接收前序和中序遍历结果(pos是用来索引区间的下标),然后向左子树递归,递归完成之后将两个数组清空,同样,再用这两个数组接收右子树前序中序遍历的结果,将右子树递归处理,最后返回根节点即可。
每日一题:LeetCode-105.从前序遍历与中序遍历构造二叉树,每日一题,leetcode,算法

  代码实现:

/**
 * 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>& preorder, vector<int>& inorder) {
        if(preorder.size() == 0) return NULL;
        int pos = 0, n = preorder.size();//下标以及二叉树节点个数
        while(inorder[pos] != preorder[0]) pos++;//找出中序遍历根节点位置
        TreeNode *root = new TreeNode(preorder[0]);//创建根节点
        vector<int> preArr, inArr;//两个临时数组接收前序中序的遍历结果

        for(int i = 1; i <= pos; i++) preArr.push_back(preorder[i]);//将前序遍历结果给数组preArr
        for(int i = 0; i < pos; i++) inArr.push_back(inorder[i]);//将中序遍历结果给inArr
        root -> left = buildTree(preArr, inArr);//左子树递归
        preArr.clear();//清理两个临时数组
        inArr.clear();

        for(int i = pos + 1 ; i < n ; i++) preArr.push_back(preorder[i]);//同样的方法
        for(int i = pos + 1 ; i < n ; i++) inArr.push_back(inorder[i]);
        root -> right = buildTree(preArr, inArr);
        return root;
    }
};

  这是一道力扣的中等题,总的来说也并不算很难,理解掌握对前序遍历与中序遍历递归构建的过程才是最重要的。文章来源地址https://www.toymoban.com/news/detail-751390.html

到了这里,关于每日一题:LeetCode-105.从前序遍历与中序遍历构造二叉树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包