前序{2,4,7}
中序为{4,7,2}
那么1 的右节点树的
前序{3,5,6,8}
中序为{,5,3,8,6}
这是一次操作,然后分别对根节点的左节点和右节点,进行相同的操作。
前序{2,4,7}
中序为{4,7,2}
那么根节点为2,根节点的
左节点树的
前序{4,7}
中序{4,7}
右节点树为null;
…
=================================================================
所以采用递归的方法,找出根节点,然后分别将左节点和右节点递归存储到二叉树中。
public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {
int length=pre.length;
if(length==0){
return null;
}
int rootVal=pre[0];
//将当前节点存入树中
TreeNode rootNode=new TreeNode(rootVal);
for(int i=0;i<length;i++){
if(rootVal== in[i]){
rootNode.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1),Arrays.copyOfRange(in,0,i));
rootNode.right=reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,length),Arrays.copyOfRange(in,i+1,length));
}
}
return rootNode;
}
这里使用了Arrays.copyOfRange(pre,begin,end) 方法,表示中pre 数组中copy数组,从begin 索引开始,到end 结束。左闭右开。
==================================================================
public class Solution {
public static void main(String[] args) {
int [] pre={1,2,4,7,3,5,6,8};
int [] in={4,7,2,1,5,3,8,6};
TreeNode treeNode=reConstructBinaryTree(pre,in);
TreeOperation.show(treeNode);
}
public static void print(TreeNode treeNode){
System.out.print(treeNode.val);
if(treeNode.left !=null ){
print(treeNode.left);
}
if(treeNode.right !=null){
print(treeNode.right);
}
System.out.println();
}
public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {
int length=pre.length;
if(length==0){
return null;
}
int rootVal=pre[0];
//将当前节点存入树中
TreeNode rootNode=new TreeNode(rootVal);
for(int i=0;i<length;i++){
if(rootVal== in[i]){
rootNode.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1),Arrays.copyOfRange(in,0,i));
rootNode.right=reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,length),Arrays.copyOfRange(in,i+1,length));
}
}
return rootNode;
}
}
然后打印二叉树,我在网上找的代码,直接拿过来用的
参考:
public class TreeOperation {
/*
树的结构示例:
1
/ \
2 3
/ \ / \
4 5 6 7
*/
// 用于获得树的层数
public static int getTreeDepth(TreeNode root) {
return root == null ? 0 : (1 + Math.max(getTreeDepth(root.left), getTreeDepth(root.right)));
}
private static void writeArray(TreeNode currNode, int rowIndex, int columnIndex, String[][] res, int treeDepth) {
// 保证输入的树不为空
if (currNode == null) return;
// 先将当前节点保存到二维数组中
res[rowIndex][columnIndex] = String.valueOf(currNode.val);
// 计算当前位于树的第几层
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://i-blog.csdnimg.cn/blog_migrate/9de51214cfe0d47113f1fa54fbbe3e9e.jpeg)
最后
按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。
学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。
“道路是曲折的,前途是光明的!”
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。
“道路是曲折的,前途是光明的!”
[外链图片转存中…(img-bN4RmYs7-1712229510458)]
[外链图片转存中…(img-3MyGKIks-1712229510458)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!