二叉树前序/中序/后序/层序遍历,四种遍历方式总结

二叉树前序/中序/后序/层序遍历,四种遍历方式总结,Java代码实现

前序遍历

先访问根节点,然后前序遍历左子树,再前序遍历右子树。
如图遍历的顺序为:ABDGHCEIF
前序遍历

中序遍历

先从根节点开始(不是先访问根节点),中序遍历根节点的左子树,然后访问根节点,最后中序遍历右子树。
如图遍历的顺序为:CDHBAEICF

中序遍历

后序遍历

从左到右按照先叶子后节点的方式遍历访问左右子树,最后访问根节点。
如图遍历的顺序为:GHDBIEFCA
后序遍历

层序遍历

从树的第一层(根节点)开始,从上到下,从左到右访问。
如图遍历的顺序为:ABCDEFGHI
层序遍历

Java代码实现

前序

   /**
     * Description: 前序遍历.
     * 根节点 -> 左子树 -> 右子
     * @author : ys.
     **/
    private void dlr(List<String> values, TreeNode node) {
        values.add(node.getValue());
        if (node.getLeft() != null) {
            dlr(values, node.getLeft());
        }
        if (node.getRight() != null) {
            dlr(values, node.getRight());
        }
    }

中序

   /**
     * Description: 中序遍历.
     * 左子树 -> 根节点 -> 右子树
     * @author : ys.
     **/
    private void ldr(List<String> values, TreeNode node) {
        if (node.getLeft() != null) {
            ldr(values, node.getLeft());
        }
        values.add(node.getValue());
        if (node.getRight() != null) {
            ldr(values, node.getRight());
        }
    }

后序

   /**
     * Description: 后序遍历.
     * 左子树 -> 根节点 -> 右子树
     * @author : ys.
     **/
    private void lrd(List<String> values, TreeNode node) {
        if (node.getLeft() != null) {
            lrd(values, node.getLeft());
        }
        if (node.getRight() != null) {
            lrd(values, node.getRight());
        }
        values.add(node.getValue());
    }

层序

   /**
     * Description: 层序遍历.
     * 上 -> 下 ; 左 -> 右
     * @author : ys.
     **/
    public void stair(List<String> values, TreeNode node) {
        //队列先进先出,取值时先取左叶子再取右叶子即可保证顺序
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(node);
        while (!queue.isEmpty()) {
            TreeNode treeNode = queue.poll();
            values.add(treeNode.getValue());
            if (treeNode.getLeft() != null) {
                queue.offer(treeNode.getLeft());
            }
            if (treeNode.getRight() != null) {
                queue.offer(treeNode.getRight());
            }
        }
    }

测试代码

public static void main(String[] args) {
        Traverse traverse = new Traverse();

        List<String> list1 = new ArrayList<>();
        traverse.dlr(list1, TreeNode.getModel());
        System.out.println("前序遍历:");
        for (String str : list1) {
            System.out.print(str + " ");
        }

        List<String> list2 = new ArrayList<>();
        traverse.ldr(list2, TreeNode.getModel());
        System.out.println();
        System.out.println("--------------------");
        System.out.println("中序遍历:");
        for (String str : list2) {
            System.out.print(str + " ");
        }

        List<String> list3 = new ArrayList<>();
        traverse.lrd(list3, TreeNode.getModel());
        System.out.println();
        System.out.println("--------------------");
        System.out.println("后序遍历:");
        for (String str : list3) {
            System.out.print(str + " ");
        }

        List<String> list4 = new ArrayList<>();
        traverse.stair(list4, TreeNode.getModel());
        System.out.println();
        System.out.println("--------------------");
        System.out.println("层序遍历:");
        for (String str : list4) {
            System.out.print(str + " ");
        }
    }

控制台输出结果

前序遍历:
A B D G H C E I F 
--------------------
中序遍历:
G D H B A E I C F 
--------------------
后序遍历:
G H D B I E F C A 
--------------------
层序遍历:
A B C D E F G H I 

TreeNode类,省略构造函数与get( )/set( )方法

/**
 * Description: .
 * @author : ys.
 */
public class TreeNode {
    private String value;
    private TreeNode left;
    private TreeNode right;

    public static TreeNode getModel() {
        TreeNode nodeI = new TreeNode("I", null, null);
        TreeNode nodeH = new TreeNode("H", null, null);
        TreeNode nodeG = new TreeNode("G", null, null);
        TreeNode nodeF = new TreeNode("F", null, null);
        TreeNode nodeE = new TreeNode("E", null, nodeI);
        TreeNode nodeD = new TreeNode("D", nodeG, nodeH);
        TreeNode nodeC = new TreeNode("C", nodeE, nodeF);
        TreeNode nodeB = new TreeNode("B", nodeD, null);
        return new TreeNode("A", nodeB, nodeC);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值