首页 > 其他分享 >JZ7 重建二叉树

JZ7 重建二叉树

时间:2023-03-30 20:46:08浏览次数:40  
标签:pre gt span lt 二叉树 JZ7 TreeNode class 重建

 

JZ7 重建二叉树

方法一:递归做法

前序的第一个结点就是根节点,而后在中序中将根节点的位置找出,根节点的左边是左子树,右边是右子树,而后再带入前序中分析,形成迭代。

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        if(pre.size() == 0 || vin.size() == 0) return nullptr; //特殊情况和迭代终止条件

        TreeNode *root = new TreeNode(pre[0]);
        for(int i = 0; i < pre.size(); i ++ ){
            if(vin[i] == pre[0]){
                vector<int>leftpre(pre.begin() + 1, pre.begin() + i + 1);
                vector<int>leftvin(vin.begin(), vin.begin() + i);
                root->left = reConstructBinaryTree(leftpre, leftvin);
                vector<int>rightpre(pre.begin() + i + 1, pre.end());
                vector<int>rightvin(vin.begin() + i + 1, vin.end());
                root->right = reConstructBinaryTree(rightpre, rightvin);
                break;
            }
        }
        return root;
    }
};
  • 时间复杂度:O(n),即每个结点都遍历一次Unexpected text node: 'O(n)'O(n),其中&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;span id="MathJax-Element-6-Frame" class="MathJax" data-mathml="&lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&gt;&lt;merror&gt;&lt;mtext&gt;Unexpected text node: 'n'&lt;/mtext&gt;&lt;/merror&gt;&lt;/math&gt;"&gt;&lt;span id="MathJax-Span-41" class="math"&gt;&lt;span id="MathJax-Span-42" class="mrow"&gt;&lt;span id="MathJax-Span-43"&gt;&lt;span id="null" class="merror"&gt;&lt;span id="MathJax-Span-44" class="mrow"&gt;&lt;span id="MathJax-Span-45" class="mtext"&gt;Unexpected text node: 'n'Unexpected text node: 'n'n为数组长度,即二叉树的节点数,构建每个节点进一次递归,递归中所有的循环加起来一共&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;span id="MathJax-Element-7-Frame" class="MathJax" data-mathml="&lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&gt;&lt;merror&gt;&lt;mtext&gt;Unexpected text node: 'n'&lt;/mtext&gt;&lt;/merror&gt;&lt;/math&gt;"&gt;&lt;span id="MathJax-Span-46" class="math"&gt;&lt;span id="MathJax-Span-47" class="mrow"&gt;&lt;span id="MathJax-Span-48"&gt;&lt;span id="null" class="merror"&gt;&lt;span id="MathJax-Span-49" class="mrow"&gt;&lt;span id="MathJax-Span-50" class="mtext"&gt;Unexpected text node: 'n'Unexpected text node: 'n'n次
  • 空间复杂度:辅助数组和迭代栈都是n,递归栈最大深度不超过n,重建的二叉树空间是必要空间,不是辅助空间

方法二:

也可以用类似非递归前序遍历的方式建立二叉树,利用栈辅助进行非递归,然后依次建立节点。

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        int n = pre.size();
        int m = vin.size();
        if(n == 0 || m == 0) return nullptr;

        stack<TreeNode*> s;
        TreeNode *root = new TreeNode(pre[0]);
        TreeNode *cur = root;

        for(int i = 1, j = 0; i < pre.size(); i ++ ){
            if(vin[j] != cur->val)//pre数组中当前节点是上一个节点的左子树
            {
                cur->left = new TreeNode(pre[i]);
                s.push(cur);
                cur = cur->left;
            }
            else
            {
                j++;
                //当前节点是上一个节点的祖先的右子树
                while(!s.empty() && s.top()->val == vin[j]){
                    cur = s.top();
                    s.pop();
                    j ++ ;
                }
                //当前节点是上一个节点的右子树
                cur ->right = new TreeNode(pre[i]);
                cur = cur->right;
            }
        }
        return root;
    }
};

 

标签:pre,gt,span,lt,二叉树,JZ7,TreeNode,class,重建
From: https://www.cnblogs.com/luxiayuai/p/17274213.html

相关文章

  • LeetCode 559.二叉树的最大深度
    1.题目:给定一个N叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。N叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。示例1:输入:root=[1,null,3,2,4,null,5,6]输出:3来源:力扣(LeetCode)链接:https://leetcode.cn/problems/maximum......
  • LeetCode 222.完全二叉树的结点个数
    1.题目:给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第h层,则该层包含1~ 2h 个节点。示例1:输入:root=[1......
  • 08. 二叉树
    一、二叉树的定义  二叉树(T)是一个有穷的结点集合,这个集合可以为空,若不为空,则它是由根节点和称为其左子树\(T_{L}\)和右子树\(T_{R}\)的两个不相交的二叉树组成......
  • 树:剑指 Offer 07. 重建二叉树
    题目描述:输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例1: Input:pre......
  • LeetCode 101.对称二叉树
    1.题目:给你一个二叉树的根节点 root ,检查它是否轴对称。 示例1:输入:root=[1,2,2,3,4,4,3]输出:true2.代码:方法一:递归实现/***Definitionforabinarytreenode.......
  • 对称的二叉树
    classSolution{public:booldfs(TreeNode*l,TreeNode*r){if(l==NULL&&r==NULL)returntrue;elseif(l&&r)re......
  • 二叉树的镜像
    classSolution{public:voidmirror(TreeNode*root){if(root==NULL)return;mirror(root->left);mirror(root->right);Tre......
  • P1119 灾后重建
    题目地址题意:给出n个村庄的灾后重建所需时间和m条双向路和它们的路径长,进行q次询问,每次询问两个村庄在时间t时的最短的路径,且路径上所有村庄都已重建,如果不存在或者t时两......
  • 二叉树(建树|遍历|寻找最大最小深度)
    二叉树基础操作1.实现思路建树:递归从数组中按照层级建立递归:提供6种建树操作(前、中、后序递归和非递归)最大深度:利用回溯|递归实现两种操作最小深度:利用递归实现2.代......
  • 医院影像科室PACS系统源码包含三维重建源码
    PACS系统是PictureArchivingandCommunicationSystems的缩写,意为影像归档和通信系统。它是应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影像(包括核磁,CT,......