二叉树的遍历

二叉树的遍历即访问树中所有的节点各一次,有以下三种遍历方式:

  • 前序遍历:树根–>左子树–>右子树
  • 中序遍历:左子树–>树根–>右子树
  • 后序遍历:左子树–>右子树–>树根

前中后指的是树根的位置,例如前序遍历就是先访问树根,中序遍历是树根在中间,后序遍历是最后访问树根,遍历方式一定是先左子树后右子树。

下面我们用如下的二叉树进行举例,二叉树的建立可参考博客
http://blog.csdn.net/zd454909951/article/details/78794263

这里写图片描述

1、前序遍历

从根节点开始处理,根节点处理完往左子树走,直到无法前进再处理右子树。
遍历结果为:6 3 2 5 4 9 7 8
递归算法如下:

    /*前序遍历*/
    public static void PreOrder(TreeNode node) {
        if(node!=null) {
            System.out.print(node.value+" ");                      //输出节点
            PreOrder(node.leftNode);                               //以相同的方法遍历左子树
            PreOrder(node.rightNode);                              //以相同的方法遍历右子树
        }
    }

2、中序遍历

沿树的左子树一直往下,直到无法前进后退回父节点,再往右子树一直往下。如果右子树也走完了就退回上层的左节点,再重复左中右的顺序。
遍历结果为:2 3 4 5 6 7 8 9
递归算法如下:

    /*中序遍历*/
    public static void InOrder(TreeNode node) {
        if(node!=null) {
            InOrder(node.leftNode);                                //以相同的方法遍历左子树
            System.out.print(node.value+" ");                      //输出节点
            InOrder(node.rightNode);                               //以相同的节点遍历右子树
        }
    }

3、后序遍历

和前序遍历方法相反,把左子树和右子树处理完后才处理树根。
遍历结果为:2 4 5 3 8 7 9 6
递归算法如下:

    /*后序遍历*/
    public static void PostOrder(TreeNode node) {
        if(node!=null) {
            PostOrder(node.leftNode);                              //以相同的方法遍历左子树
            PostOrder(node.rightNode);                             //以相同的方法遍历右子树
            System.out.print(node.value+" ");                      //输出节点
        }
    }

编写测试代码如下:

public class Test {

    static TreeNode rootNode;

    public static void main(String[] args) {
        int[] data= {6,3,5,9,7,8,4,2};
        System.out.println("原始数组内容:");
        for(int i=0;i<8;i++)
            System.out.print(data[i]+" ");
        System.out.println();   

        buildBtree(data);                                          //调用buildBtree函数建立二叉树
        System.out.println("以链表方式建立二叉树成功!\n");

        System.out.println("前序遍历结果为:");
        PreOrder(rootNode);
        System.out.println();
        System.out.println("中序遍历结果为:");
        InOrder(rootNode);
        System.out.println();
        System.out.println("后序遍历结果为:");
        PostOrder(rootNode);
    }
}

程序运行结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值