二叉树的遍历

这篇博客详细介绍了二叉树的三种遍历方式——先序遍历、中序遍历和后序遍历,分别给出了递归和非递归的Java代码实现。递归版通过函数调用自身实现,非递归版利用栈来模拟递归过程。测试代码展示了如何创建一棵二叉树并进行遍历操作。
摘要由CSDN通过智能技术生成

二叉树的两种遍历:

递归版:

    /**
     * 先序遍历
     *
     * @param head
     */
    public static void preOrder(Node head) {
        if (head == null) return;
        System.out.print(head.value + " ");
        preOrder(head.left);
        preOrder(head.right);
    }

    /**
     * 中序遍历
     *
     * @param head
     */
    public static void inOrder(Node head) {
        if (head == null) return;
        inOrder(head.left);
        System.out.print(head.value + " ");
        inOrder(head.right);
    }

    /**
     * 后序遍历
     *
     * @param head
     */
    public static void postOrder(Node head) {
        if (head == null) return;
        postOrder(head.left);
        postOrder(head.right);
        System.out.print(head.value + " ");
    }

非递归版:

    /**
     * 先序遍历 非递归版
     * 思路:
     * 使用辅助栈,如果头结点不为空,则直接将头结点压入栈中
     * 循环判断栈是否为空,不为空则弹出栈顶结点,打印,再将头结点的右子结点压入栈中,再将头结点的左子结点压入栈中
     *
     * @param head
     */
    public static void preOrderUnRecur(Node head) {
        if (head != null) {
            Stack<Node> stack = new Stack<>();
            stack.push(head);
            while (!stack.isEmpty()) {
                head = stack.pop();
                System.out.print(head.value + " ");
                if (head.right != null) stack.push(head.right);
                if (head.left != null) stack.push(head.left);
            }
        }
        System.out.println();
    }

    /**
     * 中序遍历非递归版
     * 思路:
     * 如果头结点不为空,或者当前栈不为空
     * 那么循环压入头结点的,再将头结点的指针指向头结点的左子结点,(一直压入左子结点,直到没有子结点可以继续)
     * 否则弹出栈顶元素,并打印,然后压入当前结点的右子结点
     *
     * @param head
     */
    public static void inOrderUnRecur(Node head) {
        if (head != null) {
            Stack<Node> stack = new Stack<>();
            while (head != null || !stack.isEmpty()) {
                if (head != null) {
                    stack.push(head);
                    head = head.left;
                } else {
                    head = stack.pop();
                    System.out.print(head.value + " ");
                    head = head.right;
                }
            }
        }
        System.out.println();
    }


    /**
     * 后序遍历非递归版
     * 1 2 4 3 6 7 9 11 10 8 5
     * 思路:
     * 两个辅助栈,参照先序遍历非递归版
     * 先序遍历压栈顺序:中,右,左
     * 后序遍历压栈顺序:中,左,右
     *
     * @param head
     */
    public static void posOrderUnRecur(Node head) {
        if (head != null) {
            Stack<Node> stack1 = new Stack<>();
            Stack<Node> stack2 = new Stack<>();
            stack1.push(head);
            while (!stack1.isEmpty()) {
                head = stack1.pop();
                stack2.push(head);
                if (head.left != null) stack1.push(head.left);
                if (head.right != null) stack1.push(head.right);
            }
            while (!stack2.isEmpty()) {
                head = stack2.pop();
                System.out.print(head.value + " ");
            }
        }
        System.out.println();
    }

测试代码:

// 结点类型
public static class Node {
        public int value;
        public Node left;
        public Node right;

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

	// 测试方法
    public static void main(String[] args) {
        Node head = new Node(5);
        head.left = new Node(3);
        head.right = new Node(8);
        head.left.left = new Node(2);
        head.left.right = new Node(4);
        head.left.left.left = new Node(1);
        head.right.left = new Node(7);
        head.right.left.left = new Node(6);
        head.right.right = new Node(10);
        head.right.right.left = new Node(9);
        head.right.right.right = new Node(11);
        
        //递归版
        preOrder(head);
//        inOrder(head);
//        postOrder(head);
        System.out.println();
        //非递归版
        preOrderUnRecur(head);
//        inOrderUnRecur(head);
//        posOrderUnRecur(head);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值