剑指offer_11 根据先序遍历和后序遍历构建二叉树
程序员文章站
2022-06-07 08:20:56
...
一、前序和后序遍历
二、题解
解题思路:
还是可以根据一般的思路,采用递归思想,对于每一个先序序列,划分出对应的根节点、左子树、右子树范围即可自上而下构建出二叉树。
例如对于上例中的先序序列[1,2,4,5,3,6,7],第一个节点一定为根节点,第2到第i个节点为左子树,第i+1到最后一个节点为右子树,那么问题就可以简化为:如何确定左右子树分界点?
对于这个简化过后的问题,从后序遍历序列上很容易得到答案:
三、代码实现
public TreeNode constructFromPrePost(int[] pre, int[] post) {
int N = pre.length;
if (N == 0) return null;
TreeNode root = new TreeNode(pre[0]);
if (N == 1) return root;
int L = 0;
for (int i = 0; i < N; ++i)
if (post[i] == pre[1])
L = i+1;
root.left = constructFromPrePost(Arrays.copyOfRange(pre, 1, L+1),
Arrays.copyOfRange(post, 0, L));
root.right = constructFromPrePost(Arrays.copyOfRange(pre, L+1, N),
Arrays.copyOfRange(post, L, N-1));
return root;
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/two-sum/solution/gen-ju-qian-xu-he-hou-xu-bian-li-gou-zao-er-cha-sh/
来源:力扣(LeetCode)
复杂度分析
时间复杂度:O(N^2),其中 N是结点的数量。
空间复杂度:O(N^2)
推荐阅读
-
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
-
C++实现LeetCode(889.由先序和后序遍历建立二叉树)
-
左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)
-
JAVA 实现二叉树建立和先序,中序和后序遍历(递归与非递归)
-
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
-
剑指offer_11 根据先序遍历和后序遍历构建二叉树
-
实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式
-
递归和非递归的方式实现二叉树的先序、中序和后序遍历
-
十四.实现二叉树的先序、中序、后序遍历,包括递归方式和非递归 方式
-
二叉树的先序、中序和后序遍历,递归与非递归方式实现。