leetcode刷题题解——889. 根据前序和后序遍历构造二叉树

该博客介绍了如何通过给定的前序遍历和后序遍历数组来构建二叉树。核心思路是利用前序遍历的第一个元素作为根节点,然后寻找后序遍历中左子树的末尾节点来确定左子树的长度,进而递归地构建左右子树。此算法解决了二叉树序列化与反序列化的问题。
摘要由CSDN通过智能技术生成
private int[] pre
private int[] post;

public TreeNode constructFromPrePost(int[] preorder, int[] postorder) {
    pre = preorder;
    post = postorder;
    return buildTree(0,0,pre.length);
}

private TreeNode buildTree(int i,int j,int n){
    if (n==0) return null;
    TreeNode root = new TreeNode(pre[i++]);
    if (n==1) return root;
    int L = 1;
    for (;L<n;L++) if (post[j+L-1]==pre[i])  break; 
    root.left = buildTree(i,j,L);
    root.right = buildTree(i+L,j+L,n-1-L);

    return root;
}

思路:
首先要知道
前序遍历
[根节点,(左子树),(右子树)]
后序遍历
[(左子树),(右子树),根节点]
那么,我们可以知道根节点就是前序遍历中的首元素,那么怎么将左右子树划分开来呢?如果我们知道左子树的长度是不是就可以划分开左右子树了呢?那长度又怎么获取呢?
前序遍历中左子树的根节点会出现在后序遍历的左子树的哪里呢?
答案是:最后一个
即有:pre[1]==post[L-1]
设i为前序遍历左子树的首位元素索引,j为后序遍历左子树首位元素的索引,有pre[i]=post[j+L-1]
由此即可划分左右子树进行接下来的递归

  • 将preorder和postorder存储到类中的成员变量,减少了传参时的繁琐
  • 初始时,前序遍历左子树的首位元素索引是1,但是答案里传的是0,这是因为需要先创建根节点,创建之后i就会自增1,而后序遍历的左子树首位元素索引是0,也就是传了0,并且传了子树节点的长度
  • 如果该子树长度为0,直接返回null,为1,则创建根节点后返回,长度大于1,继续划分左右子树
  • 循环获取左子树长度后,继续递归创建左右子树
  • 返回root
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绿豆蛙给生活加点甜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值