LeetCode 题解(155): Construct Binary Tree from Inorder and Postorder Traversal

本文主要是介绍LeetCode 题解(155): Construct Binary Tree from Inorder and Postorder Traversal,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

Given inorder and postorder traversal of a tree, construct the binary tree.

Note:
You may assume that duplicates do not exist in the tree.

题解:

递归。

C++版:

class Solution {
public:TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {if(inorder.size() == 0 || postorder.size() == 0)return NULL;int rootVal = postorder[postorder.size() - 1];TreeNode* root = new TreeNode(rootVal);int i = 0;while(inorder[i] != rootVal) {i++;}root->left = findRoot(inorder, 0, i - 1, postorder, 0, i - 1);root->right = findRoot(inorder, i + 1, inorder.size() - 1, postorder, i, inorder.size() - 2);return root;}TreeNode* findRoot(vector<int>& inorder, int start1, int end1, vector<int>& postorder, int start2, int end2) {if(start1 > end1)return NULL;else if(start1 == end1) {TreeNode* root = new TreeNode(inorder[start1]);return root;}else {TreeNode* root = new TreeNode(postorder[end2]);int i = start1;while(inorder[i] != postorder[end2])i++;root->left = findRoot(inorder, start1, i - 1, postorder, start2, start2 + i - start1 - 1);root->right = findRoot(inorder, i + 1, end1, postorder, start2 + i - start1, start2 - start1 + end1 - 1);return root;}}
};

Java版;

public class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {if(inorder.length == 0 || postorder.length == 0)return null;int i = 0;while(inorder[i] != postorder[postorder.length-1])i++;TreeNode root = new TreeNode(inorder[i]);root.left = findRoot(inorder, 0, i - 1, postorder, 0, i - 1);root.right = findRoot(inorder, i + 1, inorder.length - 1, postorder, i, postorder.length - 2);return root;}public TreeNode findRoot(int[] inorder, int start1, int end1, int[] postorder, int start2, int end2) {if(start1 > end1)return null;else if(start1 == end1) {TreeNode root = new TreeNode(inorder[start1]);return root;} else {int i = start1;while(inorder[i] != postorder[end2])i++;TreeNode root = new TreeNode(inorder[i]);root.left = findRoot(inorder, start1, i - 1, postorder, start2, start2 + i - 1 - start1);root.right = findRoot(inorder, i + 1, end1, postorder, start2 + i - start1, start2 - start1 + end1 - 1);return root;}}
}

Python版:

class Solution:# @param {integer[]} inorder# @param {integer[]} postorder# @return {TreeNode}def buildTree(self, inorder, postorder):if len(inorder) == 0 or len(postorder) == 0:return Nonei = 0while inorder[i] != postorder[len(postorder) - 1]:i += 1root = TreeNode(inorder[i])root.left = self.findRoot(inorder, 0, i - 1, postorder, 0, i - 1)root.right = self.findRoot(inorder, i + 1, len(inorder) - 1, postorder, i, len(postorder) - 2)return rootdef findRoot(self, inorder, start1, end1, postorder, start2, end2):if start1 > end1:return Noneelif start1 == end1:return TreeNode(inorder[start1])else:i = start1while inorder[i] != postorder[end2]:i += 1root = TreeNode(inorder[i])root.left = self.findRoot(inorder, start1, i - 1, postorder, start2, start2 + i - 1 - start1)root.right = self.findRoot(inorder, i + 1, end1, postorder, start2 + i - start1, start2 - start1 - 1 + end1)return root


这篇关于LeetCode 题解(155): Construct Binary Tree from Inorder and Postorder Traversal的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

哈希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

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

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 &

【每日一题】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

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

树(Tree)——《啊哈!算法》

树 什么是树?树是一种特殊的图,不包含回路的连通无向树。 正因为树有着“不包含回路”这个特点,所以树就被赋予了很多特性。 一棵树中的任意两个结点有且仅有唯一的一条路径连通。一棵树如果有n个结点,那么它一定恰好有n-1条边。在一棵树中加一条边将会构成一个回路。 一棵树有且只有一个根结点。 没有父结点的结点称为根结点(祖先)。没有子结点的结点称为叶结点。如果一个结点既不是根结点也不是叶