Leetcode面试经典150题-106.从中序和后序序列构造二叉树

2024-09-04 10:28

本文主要是介绍Leetcode面试经典150题-106.从中序和后序序列构造二叉树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  解法都在代码里,不懂就留言或者私信

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {/**解这个题你首先要知道二叉树的中序和后序遍历有啥特性中序:先左子树,后根,然后右子树后序:先左孩子,后右孩子,然后根一般二叉树构造这种问题我们首要的是先找到根在哪,通过中序是找不到根的。你要先通过后序找到根(最后那个),然后在中序中找根的位置,中序中根之前的是左子树,根之后的是右子树反正这么递归的搞,一会就出来了 */public TreeNode buildTree(int[] inorder, int[] postorder) {return buildTree(inorder, postorder, 0, inorder.length - 1, 0, postorder.length - 1);}/**我们这里调用这个函数的前提是inStart~inEnd和postStart~postEnd长度一定相同,不然没有任何意义这个函数的含义是从inOrder的inStart~inEnd和postOrder的postStart~postEnd构造二叉树并返回根*/public TreeNode buildTree(int[] inorder, int[] postorder, int inStart, int inEnd, int postStart, int postEnd) {/**如果就一个元素,那毫无疑问就是当前的根*/if(inStart == inEnd) {return new TreeNode(inorder[inStart]);}if(inStart > inEnd) {return null;}/**否则把postEnd位置作为根*/int rootValue = postorder[postEnd];int rootIndex = -1;for(int i = inStart; i <= inEnd; i++) {if(inorder[i] == rootValue) {rootIndex = i;break;}}/**构造当前的根节点 */TreeNode root = new TreeNode(rootValue);/**左子树是中序序列中rootIndex之前的部分,右子树是中序序列中rootIndex之后的部分后序序列也要取同等长度,左子树的长度是rootIndex-inStart这里一定要注意右子树的结束是postEnd-1而不是postEnd*/root.left = buildTree(inorder, postorder, inStart, rootIndex - 1, postStart, postStart + (rootIndex-inStart)-1);root.right = buildTree(inorder, postorder, rootIndex + 1, inEnd, postStart + (rootIndex-inStart), postEnd-1);return root;}   
}

递归解法可能常数时间比较高,只能保证时间复杂度是O(n)

这篇关于Leetcode面试经典150题-106.从中序和后序序列构造二叉树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135755

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

uva 10131 最长子序列

题意: 给大象的体重和智商,求体重按从大到小,智商从高到低的最长子序列,并输出路径。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vect

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return