二叉树遍历(前序遍历、中序遍历、后序遍历)
1.说明
-
前序遍历: 先输出父节点,再遍历左子树和右子树
-
中序遍历: 先遍历左子树,再输出父节点,再遍历右子树
-
后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点
-
小结: 看输出父节点的顺序,就确定是前序,中序还是后序
2.分析遍历的步骤
1.先创建一棵二叉树
2.前序遍历
2.1 先输出当前结点(初始时为根结点root)
2.2 如果左子结点不为空,则递归继续前序遍历
2.3如果右子结点不为空,则递归继续前序遍历
3.中序遍历
3.1 如果当前结点左子结点不为空,则递归继续中序遍历
3.2 输出当前结点
3.3 如果当前结点右子结点不为空,则递归继续中序遍历
4.后序遍历
4.1 如果当前结点左子结点不为空,则递归继续后续遍历
4.2 如果当前结点右子结点不为空,则递归继续后续遍历
4.3 输出当前结点
3.代码实现
public class BinaryTreeDemo {
public static void main(String[] args) {
// 第三步:将结点连接形成二叉树(在main方法中实现)
BinaryTree binaryTree = new BinaryTree();
//创建需要的结点
HeroNode root = new HeroNode(1, "宋江");
HeroNode heroNode2 = new HeroNode(2, "吴用");
HeroNode heroNode3 = new HeroNode(3, "卢俊义");
HeroNode heroNode4 = new HeroNode(4, "关胜");
HeroNode heroNode5 = new HeroNode(5, "林冲");
// 注意
binaryTree.setRoot(root);
//手动创建二叉树
root.setLeft(heroNode2);
root.setRight(heroNode3);
heroNode3.setLeft(heroNode4);
heroNode3.setRight(heroNode5);
//测试遍历
System.out.println("前序遍历");
binaryTree.preOrder();// 1 2 3 4 5
System.out.println("中序遍历");
binaryTree.infixOrder();// 2 1 4 3 5
System.out.println("后序遍历");
binaryTree.postOrder();// 2 4 5 3 1
}
}
// 第一步:先创建HeroNode结点
// 第二步:创建二叉树
// 第三步:将结点连接形成二叉树(在main方法中实现)
// 第二步:创建二叉树
class BinaryTree{
// 定义根结点
private HeroNode 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 infixOrder(){
if (this.root != null) {
this.root.infixOrder();
} else {
System.out.println("二叉树为空,不能遍历");
}
}
// 后序遍历
public void postOrder(){
if (this.root != null) {
this.root.postOrder();
} else {
System.out.println("二叉树为空,不能遍历");
}
}
}
//第一步:先创建HeroNode结点
class HeroNode{
private int no;
private String name;
private HeroNode left;//左子结点,默认值为null
private HeroNode right;//右子结点
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 infixOrder(){
//递归遍历左子结点
if (this.left != null) {
this.left.infixOrder();
}
//输出当前结点
System.out.println(this);
//递归遍历右子结点
if (this.right != null) {
this.right.infixOrder();
}
}
//后序遍历
public void postOrder(){
//遍历左子结点
if (this.left != null) {
this.left.postOrder();
}
// 遍历右子结点
if (this.right != null) {
this.right.postOrder();
}
// 输出当前结点
System.out.println(this);
}
}
4.测试代码中二叉树图
5.Java中this知识点补充
可以通过debug来加深对代码的理解
this的类型:哪个对象调用就是哪个对象的引用类型
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】