二叉树的中序遍历_LeetCode刷题实战105:从前序与中序遍历序列构造二叉树

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 从前序与中序遍历序列构造二叉树,我们先来看题面:

https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/

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

Note:

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

题意

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 样例 74257564c912d55c682878add57931a3.png

解题

https://www.cnblogs.com/xiaobaidashu/p/11825787.html 本题思路:了解前序遍历和中序遍历的特点并利用递归算法进行求解。前序特点:第一个元素必定是根节点,而中序遍历的特点是,根节点左右必定是左右子树的节点的集合。 步骤一:构建递归函数(前序遍历数组:preorder,int num 根节点在前序遍历数组的index值,当前中序遍历的list,root,当前根节点) 步骤二:通过preorder[num]找到当前中序遍历list中的左右子树所有值,并将左子树集合放入leftlist中,右子树集合放入rightlist中。 步骤三:通过前序中序原理,找到左子树集合和右子树集合的当前根节点root.left和root.right。并将num值变成当前根节点值的index。重复步骤一重复递归函数(preorder,newleftnum,leftlist,root.left)和(preorder,newrightnum,rightlist,root.right) 步骤四:当list中只剩下根节点时,则返回,最后输出root。

class Solution {public TreeNode buildTree(int[] preorder, int[] inorder) {if(preorder.length>0) {
             TreeNode root =new TreeNode(preorder[0]);
             List order=new ArrayList();for(int i=0;i                 order.add(inorder[i]);
             }
             getTree(preorder,0,order,root); return root;
         } else {return null;
         }
    }public void getTree(int[]preorder ,int number,List order,TreeNode root) {if(order.size()==1) {return ;
        }int ordernum=order.indexOf(preorder[number]);if(ordernum>0) {
        List leftOrder=new ArrayList(order.subList(0, ordernum)); for(int i=number+1;i        {if(leftOrder.contains(preorder[i])) {
                root.left=new TreeNode(preorder[i]);
                getTree(preorder,i,leftOrder,root.left);break;
            }
         }
        }if(ordernum-1)
        {
            List rightOrder=new ArrayList(order.subList(ordernum+1, order.size()));for(int j=number+1;j                if(rightOrder.contains(preorder[j])) {
                    root.right=new TreeNode(preorder[j]);
                    getTree(preorder,j,rightOrder,root.right);break;
                }
            }
        }
    }
}

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力。

上期推文:

LeetCode1-100题汇总,希望对你有点帮助!LeetCode刷题实战101:对称二叉树LeetCode刷题实战102:二叉树的层序遍历LeetCode刷题实战103:二叉树的锯齿形层次遍历LeetCode刷题实战104:二叉树的最大深度

df7f418f73e4754890911317b3b0ca14.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值