LeetCode-106:从中序与后序遍历序列构造二叉树

举报
小小谢先生 发表于 2022/04/16 01:00:41 2022/04/16
【摘要】 题目描述: 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树:     3    / \ &n...

题目描述:

根据一棵树的中序遍历与后序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

思路分析:

因此根据上文所述,我们可以发现后序遍历的数组最后一个元素代表的即为根节点。知道这个性质后,我们可以利用已知的根节点信息在中序遍历的数组中找到根节点所在的下标,然后根据其将中序遍历的数组分成左右两部分,左边部分即左子树,右边部分为右子树,针对每个部分可以用同样的方法继续递归下去构造。

fig1

最后直接套上代码模板就行。最主要的是清楚根节点要做什么,然后递归左子树和右子树。

代码实现:


  
  1. class Solution {
  2. public TreeNode buildTree(int[] inorder, int[] postorder) {
  3. return build(inorder,0,inorder.length-1,
  4. postorder,0,postorder.length-1);
  5. }
  6. TreeNode build(int[] inorder,int instart,int inend,
  7. int[] postorder,int postart,int poend){
  8. if(instart>inend){
  9. return null;
  10. }
  11. int index=0;
  12. int rootVal=postorder[poend];
  13. for(int i=instart;i<=inend;i++){
  14. if(rootVal==inorder[i]){
  15. index=i;
  16. break;
  17. }
  18. }
  19. TreeNode root=new TreeNode(rootVal);
  20. int leftsize=index-instart;
  21. root.left=build(inorder,instart,index-1,
  22. postorder,postart,postart+leftsize-1);
  23. root.right=build(inorder,index+1,inend,
  24. postorder,postart+leftsize,poend-1);
  25. return root;
  26. }
  27. }

 

文章来源: blog.csdn.net,作者:小小谢先生,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/xiewenrui1996/article/details/113958559

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。