算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从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.
题意
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
样例
解题
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<Integer> order=new ArrayList<Integer>();
for(int i=0;i<inorder.length;i++) {
order.add(inorder[i]);
}
getTree(preorder,0,order,root);
return root;
} else {
return null;
}
}
public void getTree(int[]preorder ,int number,List<Integer> order,TreeNode root) {
if(order.size()==1) {
return ;
}
int ordernum=order.indexOf(preorder[number]);
if(ordernum>0) {
List<Integer> leftOrder=new ArrayList<Integer>(order.subList(0, ordernum));
for(int i=number+1;i<preorder.length;i++)
{
if(leftOrder.contains(preorder[i])) {
root.left=new TreeNode(preorder[i]);
getTree(preorder,i,leftOrder,root.left);
break;
}
}
}
if(ordernum<order.size()-1)
{
List<Integer> rightOrder=new ArrayList<Integer>(order.subList(ordernum+1, order.size()));
for(int j=number+1;j<preorder.length;j++) {
if(rightOrder.contains(preorder[j])) {
root.right=new TreeNode(preorder[j]);
getTree(preorder,j,rightOrder,root.right);
break;
}
}
}
}
}
好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力。
上期推文: