题目地址(106. 从中序与后序遍历序列构造二叉树)
https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
题目描述
根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树:3/ \9 20/ \15 7
前置知识
公司
- 暂无
思路
关键点
代码
- 语言支持:Java
Java Code:
/*** 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 loop(inorder, 0, inorder.length - 1, postorder, 0, postorder.length - 1);}public TreeNode loop(int[] inorder, int inLeft, int inRight,int[] postorder, int postLeft, int postRight) {//如果中序序列为空的话 就返回nullif (inRight < inLeft ) {return null;}//找出根节点 也就是后序序列里的最后一个数int rootVal = postorder[postRight];TreeNode root = new TreeNode(rootVal);//将根节点的位置 在中序序列里找出int index = 0;for (int i = inLeft; i <= inRight; i++) {if (inorder[i] == rootVal) {index = i;break;}}//对序列分别进行拆分//左子树int leftSize = index - inLeft;root.left = loop(inorder, inLeft, index -1,postorder, postLeft, postLeft + leftSize -1);//右子树root.right = loop(inorder, index + 1, inRight,postorder, postLeft + leftSize, postRight - 1);return root;}}
复杂度分析
令 n 为数组长度。
- 时间复杂度:
#card=math&code=O%28n%29&id=zK8hd)
- 空间复杂度:
#card=math&code=O%28n%29&id=DTsoH)
