java 语言分析二叉树的前、中、后序遍历三种遍历方式

前几篇文章我们分析了几种二叉树的原理和实现,今天我们分析其遍历方式,前序遍历、中序遍历、后续遍历;我们以普通的二叉树为例;

1、实现二叉树的代码:

public class TestTwoTree {

   //定义Node节点
    public static class Node{
        int data;
        Node leftChild;
        Node rightChild;
        int height;

        public Node(int data) {
            this.data = data;
        }
    }

    public static void main(String[] arges){
        Node root = null;
        root = insertData(root,30);
        root = insertData(root,20);
        root = insertData(root,40);
        root = insertData(root,10);
        root = insertData(root,25);
    }

   
    /**
     * 添加完数据后的示意图
     *      30
     *     /  \
     *    20  40
     *   /  \
     *  10   25
     *
     */
    private static Node insertData(Node root, int data) {
        if(root == null){//首次添加数据
            root = new Node(data);
            return root;
        }
        if(data <= root.data){
            root.leftChild = insertData(root.leftChild,data);//数据放到左节点
        }else {
            root.rightChild = insertData(root.rightChild,data);//数据放到右节点
        }
        return root;
    }
}

2、上面生成了一个普通的二叉树,采用前序遍历方式输出:

//main方法里的测试代码
System.out.println("前序遍历:");
printFirstTree(root);


/**
 * 前序遍历  根左右的输出原则,即先输出根节点数据,再输出左节点数据,最后输出右节点数据
 * 执行结果: 30 20 10 25 40
 * @param root
 */
private static void printFirstTree(Node root) {
    if(root == null){
        return;
    }else {
        System.out.print(root.data+" ");//输出节点数据
        printFirstTree(root.leftChild);//输出左节点数据
        printFirstTree(root.rightChild);//输出右节点数据
    }
}

执行结果:

这里新手有时候看不懂这个代码,这里分析一次,首先这是循环递归调用自己,调用的思路符合JVM中栈的特性:后进先出!

方法里不断调用不断的返回,这里我Debug 调用详细演示一次(后面两种遍历方式,原理相同,不在这样演示了):

1)刚进入此方法时,即首次循环调用时:

2)第二次调用:

第三次:

 

3)此时其左节点为空(目前还没有经过 printFirstTree(root.rightChild); 方法),下次循环会走到  return;因为 节点 10 的左节点为空; 即第四次循环:

下一步时返回到 printFirstTree(root.rightChild);方法,如图:

 

4)第五次循环:节点10 处,右节点为空,也会走到return;如图:

返回:然后开始首次出栈,后进先出原则:

 出栈后开始下一次循环:并且数据到20处的节点。

5)第六次循环,显然20 有右节点,即右节点不为空,而是25,如图:

即下一步会打印25

 

6)第七次循环左节点为空返回,第八次循环右节点为空返回:

返回到这里:

第八次循环:

 

再次出栈:

 

然后到这里:数据为30的节点

 

7)开始了第九次循环:30的右节点是40,开始往下走,如图

开始打印 40数据:

 

8)然后继续循环,其左右节点均为空,循环后两次之后就完全出栈,执行完全结束。

 

3、中序遍历方式:特点是数据从小到大输出!

//main方法里的测试代码
System.out.println("中序遍历:");
printMidTree(root);

/**
 * 中序遍历  左根右的输出原则,即先输出左节点数据,再输出根节点数据,最后输出右节点数据
 * 执行结果 10 20 25 30 40
 * @param root
 */
private static void printMidTree(Node root) {
    if(root == null){
        return;
    }else {
        printMidTree(root.leftChild);//输出左节点数据
        System.out.print(root.data + " ");//输出节点数据
        printMidTree(root.rightChild);//输出右节点数据
    }
}

执行结果:

 

4、后序遍历方式

//main方法里的测试代码
System.out.println("后序遍历:");
printEndTree(root);

/**
 * 后序遍历  左右根的输出原则,即先输出左节点数据,再输出右节点数据  ,最后输出根节点数据
 * 执行结果: 10 25 20 40 30
 * @param root
 */
private static void printEndTree(Node root) {
    if( root == null){
        return;
    }else {
        printEndTree(root.leftChild);//输出左节点数据
        printEndTree(root.rightChild);//输出右节点数据
        System.out.print(root.data + " ");//输出节点数据
    }
}

执行结果:

 

 到此二叉树(平衡二叉树等也适用这几种遍历方法)的遍历方式分析完毕,下篇分析B+数的原理及实现,敬请期待!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寅灯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值