
二叉树的前序、中序、后序遍历以及查询
发布日期:2021-05-07 20:08:40
浏览次数:24
分类:精选文章
本文共 10383 字,大约阅读时间需要 34 分钟。
1、遍历
- 前序遍历: 先输出父节点,再遍历左子树和右子树
- 中序遍历: 先遍历左子树,再输出父节点,再遍历右子树
- 后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点
小结: 看输出父节点的顺序,就确定是前序,中序还是后序
//先创建 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 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); }}
//定义 BinaryTree 二叉树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("二叉树为空,无法遍历"); } }}
package com.example.datastructureandalgorithm.datastructure;public class BinaryTreeDemo { public static void main(String[] args) { //先需要创建一颗二叉树 BinaryTree binaryTree = new BinaryTree(); //创建需要的结点 HeroNode root = new HeroNode(1, "宋江"); HeroNode node2 = new HeroNode(2, "吴用"); HeroNode node3 = new HeroNode(3, "卢俊义"); HeroNode node4 = new HeroNode(4, "林冲"); HeroNode node5 = new HeroNode(5, "关胜"); //说明,我们先手动创建该二叉树,后面我们学习递归的方式创建二叉树 root.setLeft(node2); root.setRight(node3); node3.setRight(node4); node3.setLeft(node5); binaryTree.setRoot(root); //测试 System.out.println("前序遍历"); // 1,2,3,5,4 binaryTree.preOrder(); //测试 System.out.println("中序遍历"); binaryTree.infixOrder(); // 2,1,5,3,4 System.out.println("后序遍历"); binaryTree.postOrder(); // 2,5,4,3,1 }}
2、查找
package com.example.datastructureandalgorithm.algorithm;public class BinaryTreeDemo { public static void main(String[] args) { //先需要创建一颗二叉树 BinaryTree binaryTree = new BinaryTree(); //创建需要的结点 HeroNode root = new HeroNode(1, "宋江"); HeroNode node2 = new HeroNode(2, "吴用"); HeroNode node3 = new HeroNode(3, "卢俊义"); HeroNode node4 = new HeroNode(4, "林冲"); HeroNode node5 = new HeroNode(5, "关胜"); //说明,我们先手动创建该二叉树,后面我们学习递归的方式创建二叉树 root.setLeft(node2); root.setRight(node3); node3.setRight(node4); node3.setLeft(node5); binaryTree.setRoot(root); //测试 System.out.println("前序遍历"); // 1,2,3,5,4 binaryTree.preOrder(); //测试 System.out.println("中序遍历"); binaryTree.infixOrder(); // 2,1,5,3,4 // System.out.println("后序遍历"); binaryTree.postOrder(); // 2,5,4,3,1 //前序遍历 //前序遍历的次数 :4// System.out.println("前序遍历方式~~~");// HeroNode resNode = binaryTree.preOrderSearch(5);// if (resNode != null) { // System.out.printf("找到了,信息为 no=%d name=%s", resNode.getNo(), resNode.getName());// } else { // System.out.printf("没有找到 no = %d 的英雄", 5);// } //中序遍历查找 //中序遍历 3 次// System.out.println("中序遍历方式~~~");// HeroNode resNode = binaryTree.infixOrderSearch(5);// if (resNode != null) { // System.out.printf("找到了,信息为 no=%d name=%s", resNode.getNo(), resNode.getName());// } else { // System.out.printf("没有找到 no = %d 的英雄", 5);// } //后序遍历查找 //后序遍历查找的次数 2 次 System.out.println("后序遍历方式~~~"); HeroNode resNode = binaryTree.postOrderSearch(5); if (resNode != null) { System.out.printf("找到了,信息为 no=%d name=%s", resNode.getNo(), resNode.getName()); } else { System.out.printf("没有找到 no = %d 的英雄", 5); } }}//定义 BinaryTree 二叉树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("二叉树为空,无法遍历"); } } //前序遍历查找 public HeroNode preOrderSearch(int no) { if (root != null) { return root.preOrderSearch(no); } else { return null; } } //中序遍历查找 public HeroNode infixOrderSearch(int no) { if (root != null) { return root.infixOrderSearch(no); } else { return null; } } //后序遍历查找 public HeroNode postOrderSearch(int no) { if (root != null) { return this.root.postOrderSearch(no); } else { return null; } }}//先创建 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 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); } // 前序遍历查找 /* * * @param no 查找 no * @return 如果找到就返回该 Node ,回 如果没有找到返回 null */ public HeroNode preOrderSearch(int no) { System.out.println(" 进入前序遍历"); // 比较当前结点是不是 if (this.no == no) { return this; } //1. 则判断当前结点的左子节点是否为空,如果不为空,则递归前序查找 //2. 如果左递归前序查找,找到结点,则返回 HeroNode resNode = null; if (this.left != null) { resNode = this.left.preOrderSearch(no); } if (resNode != null) { // 说明我们左子树找到 return resNode; } //1. 左递归前序查找,找到结点,则返回,否继续判断, //2. 当前的结点的右子节点是否为空,如果不空,则继续向右递归前序查找 if (this.right != null) { resNode = this.right.preOrderSearch(no); } return resNode; } // 中序遍历查找 public HeroNode infixOrderSearch(int no) { // 判断当前结点的左子节点是否为空,如果不为空,则递归中序查找 HeroNode resNode = null; if (this.left != null) { resNode = this.left.infixOrderSearch(no); } if (resNode != null) { return resNode; } System.out.println(" 进入中序查找"); // 如果找到,则返回,如果没有找到,就和当前结点比较,如果是则返回当前结点 if (this.no == no) { return this; } // 否则继续进行右递归的中序查找 if (this.right != null) { resNode = this.right.infixOrderSearch(no); } return resNode; } // 后序遍历查找 public HeroNode postOrderSearch(int no) { // 判断当前结点的左子节点是否为空,如果不为空,则递归后序查找 HeroNode resNode = null; if (this.left != null) { resNode = this.left.postOrderSearch(no); } if (resNode != null) { // 说明在左子树找到 return resNode; } // 如果左子树没有找到,则向右子树递归进行后序遍历查找 if (this.right != null) { resNode = this.right.postOrderSearch(no); } if (resNode != null) { return resNode; } System.out.println(" 进入后序查找"); // 如果左右子树都没有找到,就比较当前结点是不是 if (this.no == no) { return this; } return resNode; }}
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年03月21日 16时40分17秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Python 简明教程 --- 20,Python 类中的属性与方法
2021-05-09
KNN 算法-理论篇-如何给电影进行分类
2021-05-09
Spring Cloud第九篇 | 分布式服务跟踪Sleuth
2021-05-09
CODING 敏捷实战系列课第三讲:可视化业务分析
2021-05-09
工作动态尽在掌握 - 使用 CODING 度量团队效能
2021-05-09
CODING DevOps 深度解析系列第二课报名倒计时!
2021-05-09
数据结构第八节(图(下))
2021-05-09
基于Mustache实现sql拼接
2021-05-09
POJ 2260 Error Correction 模拟 贪心 简单题
2021-05-09
gRPC在 ASP.NET Core 中应用学习(一)
2021-05-09
@SuppressWarnings 用法
2021-05-09
看完你就明白的锁系列之锁的状态
2021-05-09
看完这篇操作系统,和面试官扯皮就没问题了
2021-05-09
我的价值观
2021-05-09
一文详解 Java 并发模型
2021-05-09
值类型与引用类型(中)
2021-05-09
MSSQL 2005 数据库变成可疑状态
2021-05-09
QBlog V2.5 源码开放下载(ASP.NET 番外系列之开端)
2021-05-09
秋色园引发CPU百分百命案的事件分析与总结
2021-05-09
安装jdk并配置环境变量
2021-05-09