二叉树——树的遍历

       最近在复习数据结构相关的知识,并准备用Java撸一下常见的数据结构算法。先从简单的开始,分享一下二叉树的三种遍历方式。先简单的介绍一下三种遍历方式(Java编程实现在文末):

1.前序遍历

前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。

二叉树为空则结束返回,否则:

(1)访问根结点。

(2)前序遍历左子树

(3)前序遍历右子树 。

需要注意的是:遍历左右子树时仍然采用前序遍历方法。

如右图所示二叉树

前序遍历结果:ABDECF

2.中序遍历

中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。若二叉树为空则结束返回,否则:

(1)中序遍历左子树

(2)访问根结点

(3)中序遍历右子树

如右图所示二叉树,中序遍历结果:DBEAFC

注意:中序遍历是使用最多的,可以发现,在查找二叉树中,将树的各节点投影到一条直线上时,中序遍历的结果就是查找树从小到大查找所使用的算法。如下图

3.后序遍历

后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点。即:

二叉树为空则结束返回,

否则:

(1)后序遍历左子树

(2)后序遍历右子树

(3)访问根结点

如右图所示二叉树

后序遍历结果:DEBFCA

4.Java代码实现(递归方式)

/**
 * @author xinx
 * @date 2020/5/14 14:45
 */
@Data
@AllArgsConstructor
public class TreeNode {

    public int data;
    public TreeNode lNode;
    public TreeNode rNode;

    /**
     * 前序遍历:
     * @param node
     */
    public static void preOrder(TreeNode node){
        if (null != node){
            System.out.println(node.getData());
            preOrder(node.lNode);
            preOrder(node.rNode);
        }
    }

    /**
     * 中序遍历
     * @param node
     */
    public static void inOrder(TreeNode node){
        if (null != node){
            inOrder(node.lNode);
            System.out.println(node.data);
            inOrder(node.rNode);
        }
    }

    /**
     * 后序遍历
     * @param node
     */
    public static void postOrder(TreeNode node){
        if (null != node){
            postOrder(node.lNode);
            postOrder(node.rNode);
            System.out.println(node.data);
        }
    }

    public static void main(String[] args) {
        TreeNode llNode1 = new TreeNode(1, null, null);
        TreeNode lrNode1 = new TreeNode(3, null, null);
        TreeNode lNode1 = new TreeNode(2, llNode1, lrNode1);
        TreeNode rlNode1 = new TreeNode(5, null, null);
        TreeNode rrNode1 = new TreeNode(7, null, null);
        TreeNode rNode1 = new TreeNode(6, rlNode1, rrNode1);
        TreeNode node1 = new TreeNode(4, lNode1, rNode1);

        TreeNode llNode2 = new TreeNode(9, null, null);
        TreeNode lrNode2 = new TreeNode(11, null, null);
        TreeNode lNode2 = new TreeNode(10, llNode2, lrNode2);
        TreeNode rlNode2 = new TreeNode(13, null, null);
        TreeNode rrNode2 = new TreeNode(15, null, null);
        TreeNode rNode2 = new TreeNode(14, rlNode2, rrNode2);
        TreeNode node2 = new TreeNode(12, lNode2, rNode2);

        TreeNode node = new TreeNode(8, node1, node2);
        System.out.println("=============前序遍历=============");
        preOrder(node);
        System.out.println("=============中序遍历=============");
        inOrder(node);
        System.out.println("=============后序遍历=============");
        postOrder(node);
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值