二叉树的前、中、后序遍历的代码实现(递归方式)
测试的二叉树的结构
root
lfb1 rtb1rtb2
控制台输出的遍历结果
======从根节点开始,前序遍历此二叉树=======
root
lfb1
rtb1
rtb2
======从根节点开始,中序遍历此二叉树=======
lfb1
root
rtb1
rtb2
======从根节点开始,后续遍历此二叉树=======
lfb1
rtb2
rtb1
root
源码
使用递归的方式实现三种遍历。所谓递归,简单地讲,就是某个方法调用本身(但必须设置递归结束的条件,否则方法一直进行压栈操作,栈内存瞬间崩溃)
package datastructure;import java.util.ArrayList;/*** 实现二叉树的前序、中序、后续遍历* @Author gzx* @create 2022-1-26*/
public class BinaryTree {public static void main(String[] args) {// 1.构造节点,并设置节点之间的关系Node<String> root = new Node<>();root.setData("root");Node<String> lfb1 = new Node<>();lfb1.setData("lfb1");root.setLf(lfb1);Node<String> rtb1 = new Node<>();rtb1.setData("rtb1");root.setRt(rtb1);Node<String> rtb2=new Node<>();rtb2.setData("rtb2");rtb1.setRt(rtb2);
// 2.使用上述节点构造二叉树BinaryTree binaryTree = new BinaryTree();binaryTree.add(root);binaryTree.add(lfb1);binaryTree.add(rtb1);binaryTree.add(rtb2);
// 3分别使用.前序、中序、后续遍历此二叉树System.out.println("======从根节点开始,前序遍历此二叉树=======");binaryTree.preErgodic(root);System.out.println("======从根节点开始,中序遍历此二叉树=======");binaryTree.midErgodic(root);System.out.println("======从根节点开始,后续遍历此二叉树=======");binaryTree.posErgodic(root);}private ArrayList<Node<?>> tree = null;public synchronized void add(Node<?> node) {if (null == tree) {tree = new ArrayList<>();}tree.add(node);}public Node<?> getRoot() {if (tree != null && tree.size() > 0) {return tree.get(0);} else {return null;}}/*** @param root 从指定节点开始前序遍历*/public void preErgodic(Node<?> root) {if (root == null)return;System.out.println(root.getData());if (root.getLf() != null)preErgodic(root.getLf());if (root.getRt() != null)preErgodic(root.getRt());}/*** @param root 从指定节点开始中序遍历*/public void midErgodic(Node<?> root) {if (null == root)return;if (root.getLf() != null)midErgodic(root.getLf());System.out.println(root.getData());if (root.getRt() != null)midErgodic(root.getRt());}/*** @param root 从指定节点开始后序遍历*/public void posErgodic(Node<?> root) {if (null == root)return;if (root.getLf() != null)posErgodic(root.getLf());if (root.getRt() != null)posErgodic(root.getRt());System.out.println(root.getData());}}/*** 该类的一个实例表示二叉树中的一个节点<br>* 此类维护了三个Node类型的引用(pt,lf,rt),内存开销较大<br> * V 当前节点的数据的类型*/
class Node<V> {/** left node */private Node<?> lf = null;/** parent node */private Node<?> pt = null;/** right node */private Node<?> rt = null;/** current node's value */private V data;public Node() {}public Node(Node<?> lf, Node<?> pt, V data) {this.setLf(lf);this.setRt(rt);this.data = data;}public Node<?> getLf() {return lf;}public Node<?> getPt() {return pt;}public Node<?> getRt() {return rt;}public V getData() {return data;}/*** 设置指定节点lf为当前节点的左节点<br>*然后将当前节点设置为指定节点的父节点*/public void setLf(Node<?> lf) {this.lf = lf;lf.setPt(this);}private void setPt(Node<?> pt) {this.pt = pt;}/***设置指定节点rt为当前节点的右节点<br>*然后将当前节点设置为rt节点的父节点*/public void setRt(Node<?> rt) {this.rt = rt;rt.setPt(this);}public void setData(V data) {this.data = data;}/*-------下列方法用于判断当前节点的类型,但遍历时并未用到----------*//*** @return true if this node is root,false otherwise*/public boolean isRoot() {return this.getPt() == null;}/*** @return true if this node is branch,false otherwise*/public boolean isBranch() {return this.getPt() != null && (this.getLf() != null || this.getRt() != null);}/*** @return true if this node is leaf,false otherwise*/public boolean isLeaf() {return this.getPt() != null && this.getLf() == null && this.getRt() == null;}/*** @return true if this node is left leaf node or is the only node in the b* tree,false otherwise*/public boolean isLeftLeaf() {return (this.isLeaf() && this.getPt().getLf() == this) || (this.isRoot() && this.isLeaf()/* 仅有一个节点 */);}/*** @return true if this node is right leaf node or is the only node in the b* tree,false otherwise*/public boolean isRightLeaf() {return (this.isLeaf() && this.getPt().getRt() == this) || (this.isRoot() && this.isLeaf()/* 仅有一个节点 */);}/*** @param bro this node's brother node* @return true if the specified node bro is the brother node of the current* node(this node),false otherwise*/public boolean isBrother(Node<?> bro) {return this.getPt() != null && this.getPt().getRt() == bro;}
}
温馨提示:如读完此篇博客感觉有收获,不妨再看看我的其它博客,皆为原创,且都是自己思考的产物。如有不足之处,也敬请批评指正
二叉树的前、中、后序遍历的代码实现(递归方式)相关推荐
- 二叉树的前,中,后序遍历(思路分析) [Java][数据结构]
二叉树的前,中,后序遍历(思路分析) 前序遍历: 先输出父节点, 再遍历左子树和右子树 中序遍历: 先遍历左子树, 再输出父节点,再遍历右子树 后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点 ...
- Java二叉树的前中后序遍历
Java二叉树的前中后序遍历 1.前序遍历 1.1前序遍历概念 1.2前序遍历习题 2.中序遍历 2.1中序遍历概念 2.2中序遍历习题 3.后续遍历 3.1后序遍历概念 3.2后序遍历习题 大家好, ...
- 数据结构之二叉树的前中后序遍历以及层序遍历
学习目标:读完这篇博客搞定二叉树的前中后序以及层序遍历 首先:你应该明白什么是二叉树,下面这幅图就是一个完全二叉树 其实所谓的二叉树就是一个节点有小于等于二个分支的树,可以没有分支,可以有1条分支,可 ...
- 数据结构与算法(java):树-二叉树(二叉查找树(BST)、线索化二叉树、哈夫曼树、平衡二叉树【AVL】、二叉树的前中后序遍历)
二叉树 1.定义 二叉树 就是度不超过2的树(每个结点最多只有两个子结点).如图 2.特殊二叉树 满二叉树 当二叉树的每一个层的结点树都达到最大值,则这个二叉树就是满二叉树. 完全二叉树 叶结点只能出 ...
- 二叉树的前中后序遍历之迭代法(非统一风格迭代方式)
文章目录 前言 一.前序遍历(迭代法) 二.中序遍历(迭代法) 三.后序遍历(迭代法) 总结 前言 「递归的实现就是:每一次递归调用都会把函数的局部变量.参数值和返回地址等压入调用栈中」,然后递归返回 ...
- 二叉树的前中后序遍历(考试常考)
二叉树遍历的概念 二叉树的遍历是按某种规则对二叉树的每个节点均只被访问一次,根据根节点访问位置的不同分为三种:先序遍历(根左右).中序遍历(左根右).后序遍历(左右根). 由于树是通过 ...
- 【数据结构】二叉树的前中后序遍历
二叉树的三种遍历 1. 创建一棵简单的二叉树 1.1 二叉树结构体实现 1.2 创造一个二叉树结点的函数 1.3 手动创造一棵二叉树 2.为什么要遍历? 3.最重要的知识:由二叉树引出的子问题分析 4 ...
- 二叉树的前中后序遍历之迭代法(统一风格迭代方式)
一.前序遍历(迭代法)->右左中 前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子. 为什么要先加入 右孩子,再加入左孩子呢?因为这样出栈的时候 ...
- (必背)二叉树的前中后序遍历(利用栈)
二叉树的前序遍历(利用栈) 1.首先将根节点压入栈 2.栈中的首元素出栈,然后先将其右节点压入栈中,再将栈中的左节点压入栈中(如果左右节点分别存在的话) 3.重复步骤2直到栈为空 class Solu ...
- 二叉树的前中后序遍历(栈)(C++)
二叉树的遍历是很基础的东西,用递归是很简洁明了的写法,但是栈的写法也可以了解一下 #include<vector> #include<stack> struct TreeNod ...
最新文章
- python叫什么-python中什么叫类
- 创建cordova项目
- Swift: 在Swift中桥接OC文件(自己创建的类文件、第三方库文件)
- 如何在Eclipse里显示BPMN格式的流程图
- IdentityServer4专题之二:OpenID介绍
- RTSP客户端接收存储数据(live555库中的openRTSP实例)
- 【GStreamer开发】GStreamer基础教程05——集成GUI工具
- 设计模式 GOF23 模式比较
- 小米3 打开开发者选项
- 最优化学习 无约束优化问题的最优性条件
- python二级选择题与分析(10)
- vue的html自动刷新,vue项目刷新当前页面的方法
- 漂亮大气的html导航页面,非常大气漂亮的CSS导航栏
- Android 路径(Path)与剪裁(Clipping)详解
- git 贮藏弹出报错
- 软件测试与正确性论证,OO学期总结
- Proxifier 代理方式上网
- 思科路由器PPOE client+NAT解决地址回流问题测试
- WJMZBMR(陈立杰)在成都赛区开幕式上的讲话
- python程序运行结果始终为0_下列Python程序的运行结果是
x=0
y=True
print(xy and \'A\'\'B\')...
热门文章
- 交叉火力dsp手机调音软件_济南冠铭改装东风本田CRV音响二次升级丹拿232+交叉火力A6XS数字音频处理器...
- 微普年薪10W版C语言教学视频
- python向自己qq邮箱发信息_Python实现给qq邮箱发送邮件的方法
- Cocos Creator | 飞刀大乱斗开发教程系列(一)!
- UT2014补充学习笔记
- 专栏介绍:全国青少年信息学奥林匹克初赛真题(1995~2021)
- linux安装网卡驱动失败,Linux下安装网卡执行make install失败
- 墨墨背单词不能安装,出现“未安裝应用程序”,补充解决办法
- C++:对运算符重载
- 如何将一节课转成文字文稿