【数据结构】二叉树的前/中/后序遍历

前序遍历

递归实现

//递归实现前序遍历
public static void PreOrderRecur(Node head) {
    if (head == null) {
        return;
    }
    System.out.println(head);
    PreOrderRecur(head.left);
    PreOrderRecur(head.right);
}

非递归实现

//非递归实现前序遍历
public static void PreOrderUnRecur(Node head) {
    if (head == null) {
        return;
    }
    Stack<Node> stack = new Stack<>();
    stack.push(head);
    while (!stack.isEmpty()) {
        head = stack.pop();
        System.out.println(head.value);
        if (head.left != null) {
            stack.push(head.right);
        }
        if (head.right != null) {
            stack.push(head.left);
        }
    }
}

中序遍历

递归实现

//递归实现中序遍历
public static void InOrderRecur(Node head) {
    if (head == null) {
        return;
    }
    InOrderRecur(head.left);
    System.out.println(head);
    InOrderRecur(head.right);
}

非递归实现

//非递归实现中序遍历
public static void InOrderUnRecur(Node head) {
    if (head == null) {
        return;
    }
    Stack<Node> stack = new Stack<>();
    while (!stack.isEmpty() || head != null) {
        if (head != null) {
            stack.push(head);
            head = head.left;
        } else {
            head = stack.pop();
            System.out.println(head);
            head = head.right;
        }
    }
}

后序遍历

递归实现

//递归实现后序遍历
public static void PosOrderRecur(Node head) {
    if (head == null) {
        return;
    }
    PosOrderRecur(head.left);
    PosOrderRecur(head.right);
    System.out.println(head);
}

非递归实现

//非递归实现后序遍历
public static void PosOrderUnRecur(Node head) {
    if (head == null) {
        return;
    }
    //若按先左孩子进栈,再右孩子进栈,出栈的次序是头右左,所以再用一个栈就可实现左右头后序遍历
    Stack<Node> stack = new Stack<>();
    Stack<Node> printStack = new Stack<>();
    stack.push(head);
    while (!stack.isEmpty()) {
        head = stack.pop();
        printStack.push(head);
        if (head.left != null) {
            stack.push(head.left);
        }
        if (head.right != null) {
            stack.push(head.right);
        }
    }
    while (!printStack.isEmpty()) {
        System.out.println(printStack.pop().value);
    }
 }
posted @   hzyuan  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)

喜欢请打赏

扫描二维码打赏

支付宝打赏

点击右上角即可分享
微信分享提示