【数据结构与算法 13】二叉树(1)

本文详细介绍了如何在Java中实现二叉树的前序、中序和后序遍历方法,以及如何递归删除二叉树中的特定节点。内容涉及`BinaryTree`类和`HeroNode`类的定义及其实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

binaryTree.preOrder();

}

}

//定义BinaryTree 二叉树

class BinaryTree {

private HeroNode root;

public HeroNode getRoot() {

return root;

}

public void setRoot(HeroNode root) {

this.root = root;

}

//前序遍历

public void preOrder() {

if(this.root != null) {

this.root.preOrder();

}else {

System.out.println(“二叉树为空,不能遍历”);

}

}

//中序遍历

public void midOrder() {

if(this.root != null) {

this.root.midOrder();

}else {

System.out.println(“二叉树为空,无法遍历”);

}

}

//后序遍历

public void postOrder() {

if(this.root != null) {

this.root.postOrder();

}else {

System.out.println(“二叉树为空,无法遍历”);

}

}

//删除结点

public void delNode(int no) {

if(root != null) {

//如果只有一个root结点, 这里立即判断root是不是就是要删除结点

if(root.getNo() == no) {

root = null;

} else {

//递归删除

root.delNode(no);

}

}else{

System.out.println(“空树,不能删除~”);

}

}

}

//先创建HeroNode 结点

class HeroNode {

private int no;

private String name;

private HeroNode left; //默认null

private HeroNode right; //默认null

public HeroNode(int no, String name) {

this.no = no;

this.name = name;

}

public int getNo() {

return no;

}

public void setNo(int no) {

this.no = no;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public HeroNode getLeft() {

return left;

}

public void setLeft(HeroNode left) {

this.left = left;

}

public HeroNode getRight() {

return right;

}

public void setRight(HeroNode right) {

this.right = right;

}

@Override

public String toString() {

return “HeroNode [no=” + no + “, name=” + name + “]”;

}

//前序遍历

public void preOrder() {

System.out.println(this);//先输出父节点

//递归向左子树前序遍历

if(this.left != null) {

this.left.preOrder();

}

//递归向右子树前序遍历

if(this.right != null) {

this.right.preOrder();

}

}

//中序遍历

public void midOrder() {

//递归向左子树中序遍历

if(this.left != null) {

this.left.midOrder();

}

System.out.println(this);//输出父节点

//递归向右子树前序遍历

if(this.right != null) {

this.right.midOrder();

}

}

//后序遍历

public void postOrder() {

//递归向左子树后序遍历

if(this.left != null) {

this.left.postOrder();

}

//递归向右子树前序遍历

if(this.right != null) {

this.right.postOrder();

}

System.out.println(this);//输出父节点

}

//递归删除结点

//1.如果删除的节点是叶子节点,则删除该节点

//2.如果删除的节点是非叶子节点,则删除该子树

public void delNode(int no) {

//思路

/*

    1. 因为我们的二叉树是单向的,所以我们是判断当前结点的子结点是否需要删除结点,而不能去判断当前这个结点是不是需要删除结点.
  1. 如果当前结点的左子结点不为空,并且左子结点 就是要删除结点,就将this.left = null; 并且就返回(结束递归删除)

  2. 如果当前结点的右子结点不为空,并且右子结点 就是要删除结点,就将this.right= null ;并且就返回(结束递归删除)

  3. 如果第2和第3步没有删除结点,那么我们就需要向左子树进行递归删除

  4. 如果第4步也没有删除结点,则应当向右子树进行递归删除.

*/

//2. 如果当前结点的左子结点不为空,并且左子结点 就是要删除结点,就将this.left = null; 并且就返回(结束递归删除)

if(this.left != null && this.left.no == no) {

this.left = null;

return;

}

//3.如果当前结点的右子结点不为空,并且右子结点 就是要删除结点,就将this.right= null ;并且就返回(结束递归删除)

if(this.right != null && this.right.no == no) {

this.right = null;

return;

}

//4.我们就需要向左子树进行递归删除

if(this.left != null) {

this.left.delNode(no);

}

//5.则应当向右子树进行递归删除

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

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

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

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

img

写在最后

为了这次面试,也收集了很多的面试题!

以下是部分面试题截图

Java程序员秋招三面蚂蚁金服,我总结了所有面试题,也不过如此
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
以扫码获取!!(备注Java获取)**

img

写在最后

为了这次面试,也收集了很多的面试题!

以下是部分面试题截图

[外链图片转存中…(img-Yxbixlf5-1713420900029)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值