《剑指offer》之重建二叉树

文章描述了一种使用递归方法根据给定的前序和中序遍历序列构建二叉树的算法,通过复制数组范围找到根节点并递归地构造左右子树。
摘要由CSDN通过智能技术生成

前序{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;

}

}

然后打印二叉树,我在网上找的代码,直接拿过来用的

参考:

按照树形结构直观地打印出一棵二叉树(Java)

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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。

学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。

道路是曲折的,前途是光明的!”

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。

道路是曲折的,前途是光明的!”

[外链图片转存中…(img-bN4RmYs7-1712229510458)]

[外链图片转存中…(img-3MyGKIks-1712229510458)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值