第三章 二叉树问题(分别用递归和非递归的方式实现二叉树的先序、中序、后序遍历)

【题目】

        用递归和非递归的方式,分别按照二叉树的先序、中序和后序打印所有的节点,我们约定:先序遍历顺序为根、左、右,中序遍历的顺序为左、根、右,后序遍历顺序为左、右、根。

【解答】

package zcy;

import java.sql.Statement;
import java.util.Stack;

/**
 * 二叉树
 */
public class P94_BinaryTree {

    public static void preOrder(Node head) {
        if (head == null) {
            return;
        }
        System.out.println(head.value);
        preOrder(head.left);
        preOrder(head.right);
    }

    /**
     * 用栈的方式实现先序遍历  头左右
     * 1、申请一个新的栈,记为stack,然后将头节点head压入stack中
     * 2、从stack中弹出栈顶节点,记为cur,然后打印cur的值,再将cur的右节点压入栈中,然后再将cur的左节点压入栈中
     * 3、不断重复步骤2,直到stack栈空为止
     *
     * @param head
     */
    public static void preOrderStack(Node head) {
        if (head == null) {
            return;
        }
        Stack<Node> s1 = new Stack<Node>();
        s1.add(head);
        while (!s1.isEmpty()) {
            Node cur = s1.pop();
            System.out.println(cur.value);
            if (cur.right != null) {
                s1.add(cur.right);
            }
            if (cur.left != null) {
                s1.add(cur.left);
            }
        }
    }

    public static void midOrder(Node head) {
        if (head == null) {
            return;
        }
        System.out.println(head.value);
        midOrder(head.left);
        midOrder(head.right);
    }

    /**
     * 用栈的方式实现中序遍历 左头右
     * 1、申请一个新的栈,记为stack。初始时,令变量 cur = head
     * 2、先把cur节点压入栈中,对以cur节点为头节点的整颗子树来说,依次把左边界压入栈中,即不停的令cur = cur.left, 然后重复步骤2
     * 3、不断重复步骤2,直到cur 为空,此时从栈中弹出一个节点,记为node,打印node值,并且让cur = node.right,然后重复步骤2
     * 4、当stack为空且cur为空时,整个过程停止
     *
     * @param head
     */
    public static void midOrderStack(Node head) {

        if (head == null) {
            return;
        }
        Stack<Node> s1 = new Stack<Node>();
        Node cur = head;
        while (!s1.isEmpty() || cur != null) {
            if (cur != null) {
                s1.add(cur);
                cur = cur.left;
            } else {
                cur = s1.pop();
                System.out.println(cur.value);
                cur = cur.right;
            }
        }

    }

    public static void posOrder(Node head) {
        if (head == null) {
            return;
        }
        System.out.println(head.value);
        posOrder(head.left);
        posOrder(head.right);
    }

    /**
     * 用栈实现后序遍历 左右头
     * 1、申请两个栈s1、s2,初始化将head 放入s1
     * 2、从s1中弹出一个节点,记为cur,先将cur 的右节点放入s1,然后将cur的左节点放入s2,并将cur放入s2中,重复步骤2
     * 3、当s1栈空,结束循环
     * 4、依次打印s2中的节点值
     *
     * @param head
     */
    public static void posOrderStack(Node head) {
        if (head == null) {
            return;
        }
        Stack<Node> s1 = new Stack<Node>();
        Stack<Node> s2 = new Stack<Node>();
        s1.add(head);
        while (!s1.isEmpty()) {
            Node cur = s1.pop();
            s2.push(cur);
            if (cur.right != null) {
                s1.add(cur.right);
            }
            if (cur.left != null) {
                s1.add(cur.left);
            }
        }
        while (!s2.isEmpty()) {
            System.out.println(s2.pop().value);
        }
    }

    public static class Node {

        public int value;

        public Node left;

        public Node right;

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值