首页 > 其他分享 >从前序与中序遍历序列构造二叉树(递归)

从前序与中序遍历序列构造二叉树(递归)

时间:2024-12-25 11:10:35浏览次数:4  
标签:preorder 遍历 TreeNode int 中序 right 二叉树 inorder left

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

 

示例 1:

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

示例 2:

输入: preorder = [-1], inorder = [-1]
输出: [-1]

 

/**
 * 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:
    map<int,int> index;
    TreeNode* myBuildTree(vector<int>& preorder, vector<int>& inorder,int preorder_left,int preorder_right,int inorder_left,int inorder_right){
        if(preorder_right-preorder_left<0) return nullptr;//先序序列已遍历完毕
        //构造当前节点
        TreeNode* node = new TreeNode(preorder[preorder_left]);
        //确定当前节点在中序序列中的位置
        int inorder_node = index[node->val];
        //确定当前节点的左子树的节点数
        int leftsize = inorder_node - inorder_left;
        //递归构造该节点的左右子树
        node->left= myBuildTree(preorder,inorder,preorder_left+1,preorder_left+leftsize,inorder_left,inorder_node-1);
        node->right= myBuildTree(preorder,inorder,preorder_left+leftsize+1,preorder_right,inorder_node+1,inorder_right); 
        return node;

    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int n = preorder.size();
        //对inoder序列构造从值到索引的映射,以便能根据值快速找到在inorder中的索引
        for(int i=0;i<n;i++){
            index[inorder[i]] =i;
        }
        //构造二叉树
        return myBuildTree(preorder,inorder,0,n-1,0,n-1); 
    }
};

 

标签:preorder,遍历,TreeNode,int,中序,right,二叉树,inorder,left
From: https://www.cnblogs.com/yueshengd/p/18629954

相关文章

  • 二叉树展开为链表(先序遍历)
    给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。 示例1:输入:root=[1,2,5,3,4,null,6]输出:[1,null,......
  • 二叉树的右视图(层次遍历)
    给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例1:输入:root=[1,2,3,null,5,null,4]输出:[1,3,4]解释:示例2:输入:root=[1,2,3,4,null,null,null,5]输出:[1,3,4,5]解释:示例3:输入:root=[1,null,3......
  • LeetCode94二叉树的中序遍历
    原理二叉树的中序遍历遵循“左子树-根节点-右子树”的顺序来访问二叉树中的每个节点。其基本原理是利用递归的思想,先递归地遍历根节点的左子树,访问完左子树的所有节点后,再访问根节点本身,最后递归地遍历根节点的右子树,这样就能按照中序遍历的规则依次访问二叉树中的所有......
  • 二叉树的层序遍历(队列)
    给你二叉树的根节点 root ,返回其节点值的 层序遍历 。(即逐层地,从左到右访问所有节点)。 示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例2:输入:root=[1]输出:[[1]]示例3:输入:root=[]输出:[] /***Definitionforabinarytreen......
  • 二叉树的直径(递归)
    给你一棵二叉树的根节点,返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它们之间边数表示。 示例1:输入:root=[1,2,3,4,5]输出:3解释:3,取路径[4,2,1,3]或......
  • LeetCode:222.完全二叉树节点的数量
    跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的!代码随想录LeetCode:222.完全二叉树节点的数量给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节......
  • 第六章 二叉树part 01
    又是一种神奇的数据结构,可以让数据查询效率以指数级递减首先需要理解并掌握的是二叉树的遍历,遍历还分为两种,一种是递归遍历,代码简单到令人发指;另一种是迭代(是不是就是递推)今天只能先开个头,明天再补齐二叉树的递归遍历structTreeNode{intval;TreeNode*left;......
  • 【LeetCode】LCR 175.计算二叉树的深度
    题目链接:LCR175.计算二叉树的深度题目描述:思路一(深度优先搜索):使用深度优先搜索算法进行二叉树后序遍历复杂度分析:时间复杂度O(N):N为树的节点数量,计算树的深度需要遍历所有节点空间复杂度O(N):最差情况下(当树退化为链表时),递归深度可达到N/***Definitionfor......
  • 对称二叉树(递归)
    给你一个二叉树的根节点 root ,检查它是否轴对称。 示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输出:false /***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*......
  • 翻转二叉树(递归)
    给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]/***Definitionforabinarytreenode.*structTreeNode{*......