二叉树的前中后序查找+思路分析
思路分析
代码实现
package com.atguigu.tree;/*** @创建人 wdl* @创建时间 2021/3/24* @描述*/
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,4binaryTree.preOrder();System.out.println("中序遍历");//2,1,5,3,4binaryTree.infixOrder();System.out.println("后序遍历");//2,5,4,3,1binaryTree.postOrder();// //前序查找
// //前序查找的次数
// System.out.println("前序查找");
// HeroNode resNode = binaryTree.preOrderSearch(5);
// if(resNode!=null){// System.out.println("找到了,信息为no="+resNode.getNo()+",name="+resNode.getName());
// }else {// System.out.println("没有找都no="+15+"的英雄");
// }// //中序查找
// //中序查找的次数
// System.out.println("中序查找");
// HeroNode resNode = binaryTree.infixOrderSearch(5);
// if(resNode!=null){// System.out.println("找到了,信息为no="+resNode.getNo()+",name="+resNode.getName());
// }else {// System.out.println("没有找都no="+15+"的英雄");
// }//后序查找//后序查找的次数System.out.println("后序查找");HeroNode resNode = binaryTree.postOrderSearch(5);if(resNode!=null){System.out.println("找到了,信息为no="+resNode.getNo()+",name="+resNode.getName());}else {System.out.println("没有找都no="+15+"的英雄");}}}//定义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 root.postOrderSearch(no);}else {return null;}}}//先创建HeroNode节点
class HeroNode{private int no;private String name;private HeroNode left;//默认为nullprivate HeroNode right;//默认为nullpublic HeroNode(int no, String name) {super();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;}@Overridepublic 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;}}
二叉树的前中后序查找+思路分析相关推荐
- 二叉树的前,中,后序遍历(思路分析) [Java][数据结构]
二叉树的前,中,后序遍历(思路分析) 前序遍历: 先输出父节点, 再遍历左子树和右子树 中序遍历: 先遍历左子树, 再输出父节点,再遍历右子树 后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点 ...
- 数据结构与算法(java):树-二叉树(二叉查找树(BST)、线索化二叉树、哈夫曼树、平衡二叉树【AVL】、二叉树的前中后序遍历)
二叉树 1.定义 二叉树 就是度不超过2的树(每个结点最多只有两个子结点).如图 2.特殊二叉树 满二叉树 当二叉树的每一个层的结点树都达到最大值,则这个二叉树就是满二叉树. 完全二叉树 叶结点只能出 ...
- 数据结构之二叉树的前中后序遍历以及层序遍历
学习目标:读完这篇博客搞定二叉树的前中后序以及层序遍历 首先:你应该明白什么是二叉树,下面这幅图就是一个完全二叉树 其实所谓的二叉树就是一个节点有小于等于二个分支的树,可以没有分支,可以有1条分支,可 ...
- 深入理解二叉树的前中后序
一.问题 二叉树的前中后序遍历到底是什么,仅仅是三个顺序不同的 List 吗?为什么多叉树没有中序遍历? 二.遍历框架 所谓二叉树遍历是按某种特定规则,依次对二叉树中的节点进行相应的操作,并且每个节点 ...
- Java二叉树的前中后序遍历
Java二叉树的前中后序遍历 1.前序遍历 1.1前序遍历概念 1.2前序遍历习题 2.中序遍历 2.1中序遍历概念 2.2中序遍历习题 3.后续遍历 3.1后序遍历概念 3.2后序遍历习题 大家好, ...
- 二叉树的前中后序遍历之迭代法(非统一风格迭代方式)
文章目录 前言 一.前序遍历(迭代法) 二.中序遍历(迭代法) 三.后序遍历(迭代法) 总结 前言 「递归的实现就是:每一次递归调用都会把函数的局部变量.参数值和返回地址等压入调用栈中」,然后递归返回 ...
- 二叉树的前中后序遍历(考试常考)
二叉树遍历的概念 二叉树的遍历是按某种规则对二叉树的每个节点均只被访问一次,根据根节点访问位置的不同分为三种:先序遍历(根左右).中序遍历(左根右).后序遍历(左右根). 由于树是通过 ...
- Java~二叉树的前中后序遍历的几种方式(递归法,迭代法,标记法等)
目录 一.结点的定义 二.递归法遍历二叉树 前序遍历 中序遍历 后序遍历 三.迭代(非递归)遍历二叉树 (1).迭代模拟法 前序遍历 中序遍历 后序遍历 (2).空指针标记法 前序遍历 中序遍历 后序 ...
- 【数据结构】二叉树的前中后序遍历
二叉树的三种遍历 1. 创建一棵简单的二叉树 1.1 二叉树结构体实现 1.2 创造一个二叉树结点的函数 1.3 手动创造一棵二叉树 2.为什么要遍历? 3.最重要的知识:由二叉树引出的子问题分析 4 ...
最新文章
- 怎么将string list 转成有特殊字符分开字符串
- OEL6.8安装虚拟带库模拟器
- 通过JSR250规范 提供的注解@PostConstruct 和@ProDestory标注的方法
- centos安装ES(elasticsearch)
- SonarQube+Jenkins,搭建持续交付平台
- Linux 查看ssh登录日志 ssh登录记录
- linux caffe ssd 编译,Ubuntu 16.04 编译 Caffe SSD
- C#一个方法返回多个值
- 无源晶振有方向吗?无源贴片晶振贴反会怎样?
- ffmpeg 修改分辨率
- 机器算法基础——回归分析
- IC卡与磁条卡的数据区别
- 思维题:12个硬币中有1个假币,假币的重量与真币不同,如何用天平最多称量3次找出假币?
- docker-compose基本命令使用
- OPTEE学习笔记 - AArch64 RPC(一)
- 拉伸流变仪VADER 1000-丹麦RHEO FILAMENT
- android studio开发工具新手入门
- Java实例——为新员工分配部门
- 计算机病毒过滤论文,计算机病毒毕业论文
- 2022-4-19 同时读取带外数据和正常数据《Linux高性能服务器》笔记
热门文章
- 受检异常 非受检异常_这样设计 Java 异常更优雅,赶紧学
- 卸载chrome_Chrome 浏览器必备“扩展管理工具”,一键管理 Chrome 扩展
- 算法---会议最大安排问题
- Codeforces Round #717 (Div. 2) D(倍增dp)
- bzoj4543. [POI2014]Hotel加强版
- 牛客题霸 [删除有序链表中重复的元素] C++题解/答案
- 【学习笔记】同余最短路
- P7920-[Kubic]Permutation
- P3308-[SDOI2014]LIS【最小割】
- 51nod1601-完全图的最小生成树计数【Trie,分治】