二叉树的前/中/后序遍历

1 前序遍历

    // 前序遍历Recursively
    public void preorderTraversal_R(TreeNode root, ArrayList<Integer> aList) {
        if (root == null)
            return;
        aList.add(root.val);
        if (root.left != null) {
            preorderTraversal_R(root.left, aList);
        }
        if (root.right != null) {
            preorderTraversal_R(root.right, aList);
        }
    }
    // 前序遍历Iteratively
    public void preorderTraversal_I(TreeNode root, ArrayList<Integer> aList) {
        if (root == null)
            return;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode p = root;
        while (p != null || !stack.isEmpty()) {
            if (p != null) {
                aList.add(p.val);
                stack.push(p);
                p = p.left;
            } else {
                p = stack.pop();
                p = p.right;
            }
        }
    }


2 中序遍历

    // 中序遍历Recursively
    public void inorderTraversal_R(TreeNode root, ArrayList<Integer> aList) {
        if (root == null)
            return;
        if (root.left != null) {
            inorderTraversal_R(root.left, aList);
        }
        aList.add(root.val);
        if (root.right != null) {
            inorderTraversal_R(root.right, aList);
        }
    }
    // 中序遍历Iteratively
    public void inorderTraversal_I(TreeNode root, ArrayList<Integer> aList) {
        if (root == null)
            return;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode p = root;
        while (p != null || !stack.isEmpty()) {
            if (p != null) {
                stack.push(p);
                p = p.left;
            } else {
                p = stack.pop();
                aList.add(p.val);
                p = p.right;
            }
        }
    }


3 后续遍历

    // 后序遍历Recursively
    public void postorderTraversal_R(TreeNode root, ArrayList<Integer> aList) {
        if (root == null)
            return;
        if (root.left != null) {
            postorderTraversal_R(root.left, aList);
        }
        if (root.right != null) {
            postorderTraversal_R(root.right, aList);
        }
        aList.add(root.val);
    }
    // 后序遍历Iteratively
    // 需要判断左右子树都遍历过了,才能输出跟节点的val
    public void postorderTraversal_I(TreeNode root, ArrayList<Integer> aList) {
        if (root == null)
            return;
        TreeNode p = root;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        HashMap<TreeNode, Integer> hMap = new HashMap<TreeNode, Integer>();
        while(p != null || !stack.isEmpty()){
            while(p != null){
                p.isFirst = true;
                stack.push(p);
                p = p.left;
            }

            if(!stack.empty()){
                p = stack.pop();
                if(p.isFirst){
                    p.isFirst = false;
                    stack.push(p);
                    p = p.right;
                }
                else {
                    aList.add(p.val);
                    p = null;
                }
            }
        }


4 运行结果

    public static void main(String[] args) {
        /*
         * 建立一颗二叉树 
         *    3 
         *   / \ 
         *   9 20 
         *     / \ 
         *    15 7
         **/

        TreeNode root = new TreeNode(3);
        TreeNode l = new TreeNode(9);
        TreeNode r = new TreeNode(20);
        TreeNode rl = new TreeNode(15);
        TreeNode rr = new TreeNode(7);
        root.left = l;
        root.right = r;
        r.left = rl;
        r.right = rr;

        System.out.println("中序遍历Recursively:");
        aList.clear();
        sol.inorderTraversal_R(root, aList);
        for (Integer integer : aList) {
            System.out.println(integer);
        }

        System.out.println("中序遍历Iteratively:");
        sol.inorderTraversal_I(root, aList);
        for (Integer integer : aList) {
            System.out.println(integer);
        }

        System.out.println("前序遍历Recursively:");
        aList.clear();
        sol.preorderTraversal_R(root, aList);
        for (Integer integer : aList) {
            System.out.println(integer);
        }

        System.out.println("前序遍历Iteratively:");
        aList.clear();
        sol.preorderTraversal_I(root, aList);
        for (Integer integer : aList) {
            System.out.println(integer);
        }

        System.out.println("后序遍历Recursively:");
        aList.clear();
        sol.postorderTraversal_R(root, aList);
        for (Integer integer : aList) {
            System.out.println(integer);
        }

        System.out.println("后序遍历Iteratively:");
        aList.clear();
        sol.postorderTraversal_I(root, aList);
        for (Integer integer : aList) {
            System.out.println(integer);
        }

这里写图片描述

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值