测试的二叉树的结构

     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;}
}

温馨提示:如读完此篇博客感觉有收获,不妨再看看我的其它博客,皆为原创,且都是自己思考的产物。如有不足之处,也敬请批评指正

二叉树的前、中、后序遍历的代码实现(递归方式)相关推荐

  1. 二叉树的前,中,后序遍历(思路分析) [Java][数据结构]

    二叉树的前,中,后序遍历(思路分析) 前序遍历: 先输出父节点, 再遍历左子树和右子树 中序遍历: 先遍历左子树, 再输出父节点,再遍历右子树 后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点 ...

  2. Java二叉树的前中后序遍历

    Java二叉树的前中后序遍历 1.前序遍历 1.1前序遍历概念 1.2前序遍历习题 2.中序遍历 2.1中序遍历概念 2.2中序遍历习题 3.后续遍历 3.1后序遍历概念 3.2后序遍历习题 大家好, ...

  3. 数据结构之二叉树的前中后序遍历以及层序遍历

    学习目标:读完这篇博客搞定二叉树的前中后序以及层序遍历 首先:你应该明白什么是二叉树,下面这幅图就是一个完全二叉树 其实所谓的二叉树就是一个节点有小于等于二个分支的树,可以没有分支,可以有1条分支,可 ...

  4. 数据结构与算法(java):树-二叉树(二叉查找树(BST)、线索化二叉树、哈夫曼树、平衡二叉树【AVL】、二叉树的前中后序遍历)

    二叉树 1.定义 二叉树 就是度不超过2的树(每个结点最多只有两个子结点).如图 2.特殊二叉树 满二叉树 当二叉树的每一个层的结点树都达到最大值,则这个二叉树就是满二叉树. 完全二叉树 叶结点只能出 ...

  5. 二叉树的前中后序遍历之迭代法(非统一风格迭代方式)

    文章目录 前言 一.前序遍历(迭代法) 二.中序遍历(迭代法) 三.后序遍历(迭代法) 总结 前言 「递归的实现就是:每一次递归调用都会把函数的局部变量.参数值和返回地址等压入调用栈中」,然后递归返回 ...

  6. 二叉树的前中后序遍历(考试常考)

    二叉树遍历的概念 二叉树的遍历是按某种规则对二叉树的每个节点均只被访问一次,根据根节点访问位置的不同分为三种:先序遍历(根左右).中序遍历(左根右).后序遍历(左右根).         由于树是通过 ...

  7. 【数据结构】二叉树的前中后序遍历

    二叉树的三种遍历 1. 创建一棵简单的二叉树 1.1 二叉树结构体实现 1.2 创造一个二叉树结点的函数 1.3 手动创造一棵二叉树 2.为什么要遍历? 3.最重要的知识:由二叉树引出的子问题分析 4 ...

  8. 二叉树的前中后序遍历之迭代法(统一风格迭代方式)

    一.前序遍历(迭代法)->右左中 前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子. 为什么要先加入 右孩子,再加入左孩子呢?因为这样出栈的时候 ...

  9. (必背)二叉树的前中后序遍历(利用栈)

    二叉树的前序遍历(利用栈) 1.首先将根节点压入栈 2.栈中的首元素出栈,然后先将其右节点压入栈中,再将栈中的左节点压入栈中(如果左右节点分别存在的话) 3.重复步骤2直到栈为空 class Solu ...

  10. 二叉树的前中后序遍历(栈)(C++)

    二叉树的遍历是很基础的东西,用递归是很简洁明了的写法,但是栈的写法也可以了解一下 #include<vector> #include<stack> struct TreeNod ...

最新文章

  1. python叫什么-python中什么叫类
  2. 创建cordova项目
  3. Swift: 在Swift中桥接OC文件(自己创建的类文件、第三方库文件)
  4. 如何在Eclipse里显示BPMN格式的流程图
  5. IdentityServer4专题之二:OpenID介绍
  6. RTSP客户端接收存储数据(live555库中的openRTSP实例)
  7. 【GStreamer开发】GStreamer基础教程05——集成GUI工具
  8. 设计模式 GOF23 模式比较
  9. 小米3 打开开发者选项
  10. 最优化学习 无约束优化问题的最优性条件
  11. python二级选择题与分析(10)
  12. vue的html自动刷新,vue项目刷新当前页面的方法
  13. 漂亮大气的html导航页面,非常大气漂亮的CSS导航栏
  14. Android 路径(Path)与剪裁(Clipping)详解
  15. git 贮藏弹出报错
  16. 软件测试与正确性论证,OO学期总结
  17. Proxifier 代理方式上网
  18. 思科路由器PPOE client+NAT解决地址回流问题测试
  19. WJMZBMR(陈立杰)在成都赛区开幕式上的讲话
  20. python程序运行结果始终为0_下列Python程序的运行结果是 x=0 y=True print(xy and \'A\'\'B\')...

热门文章

  1. 交叉火力dsp手机调音软件_济南冠铭改装东风本田CRV音响二次升级丹拿232+交叉火力A6XS数字音频处理器...
  2. 微普年薪10W版C语言教学视频
  3. python向自己qq邮箱发信息_Python实现给qq邮箱发送邮件的方法
  4. Cocos Creator | 飞刀大乱斗开发教程系列(一)!
  5. UT2014补充学习笔记
  6. 专栏介绍:全国青少年信息学奥林匹克初赛真题(1995~2021)
  7. linux安装网卡驱动失败,Linux下安装网卡执行make install失败
  8. 墨墨背单词不能安装,出现“未安裝应用程序”,补充解决办法
  9. C++:对运算符重载
  10. 如何将一节课转成文字文稿