二叉树的先序,中序,后序遍历 -- 包含递归和非递归版本

package basic_class_04;

import java.util.Stack;


/**
 * 实现二叉树的先序、中序、后序遍历,包括递归方式和非递归 方式
 * @author lenovo
 *
 */
public class Code_01_PreInPosTraversal_1 {

    public static class Node {
        public int value;
        public Node left;
        public Node right;

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

    // 先序遍历的递归版本
    public static void preOrderRecur(Node head) {
        if(head == null) {
            return;
        }
        System.out.print(head.value + " ");
        preOrderRecur(head.left);
        preOrderRecur(head.right);

    }

    // 先序遍历的非递归版本
    public static void preOrderUnRecur(Node head) {
        System.out.println("pre-order: ");
        if(head != null) {
            Stack<Node> stack = new Stack<Node>();
            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();
    }

    // 中序遍历的递归版本
    public static void inOrderRecur(Node head) {
        if(head == null) {
            return;
        }
        inOrderRecur(head.left);
        System.out.print(head.value + " ");
        inOrderRecur(head.right);
    }
    // 中序遍历的非递归版本
    public static void inOrderUnRecur(Node head) {
        System.out.println("in-order: ");
        if(head != null) {
            Stack<Node> stack = new Stack<Node>();
            while(!stack.isEmpty() || head != null) {
                if(head != null) {
                    stack.push(head);
                    head = head.left;
                } else {
                    head = stack.pop();
                    System.out.print(head.value + " ");
                    head = head.right;
                }
            }
        }
    }


    // 后序遍历的递归版本
    public static void posOrderRecur(Node head) {
        if(head == null) {
            return;
        }
        posOrderRecur(head.left);
        posOrderRecur(head.right);
        System.out.print(head.value + " ");
    }

    // 后序遍历的非递归版本
    public static void posOrderUnRecur(Node head) {
        System.out.println("pos-order: ");
        if(head != null) {
            Stack<Node> s1 = new Stack<Node>();
            Stack<Node> s2 = new Stack<Node>();

            s1.push(head);

            while(!s1.isEmpty()) {
                head = s1.pop();
                s2.push(head);
                if(head.left != null) {
                    s1.push(head.left);
                }
                if(head.right != null) {
                    s1.push(head.right);
                }
            }


            while(!s2.isEmpty()) {
                System.out.print(s2.pop().value + " ");
            }

        }
    }


    // 后序遍历的非递归版本  --  方法二 
    public static void inOrderUnRecur_1(Node head) {
        System.out.print("in-order: ");
        if (head != null) {
            Stack<Node> stack = new Stack<Node>();
            while (!stack.isEmpty() || head != null) {
                if (head != null) {
                    stack.push(head);
                    head = head.left;
                } else {
                    head = stack.pop();
                    System.out.print(head.value + " ");
                    head = head.right;
                }
            }
        }
        System.out.println();
    }


    // 测试方法
    public static void main(String[] args) {
        Node head = new Node(1);
        head.left = new Node(2);
        head.right = new Node(3);
        head.left.left = new Node(4);
        head.left.right = new Node(5);
        head.right.left = new Node(6);
        head.right.right = new Node(7);
        head.left.left.left = new Node(8);
        head.left.left.right = new Node(9);
        head.left.right.left = new Node(10);
        head.left.right.right = new Node(11);

        posOrderRecur(head);
        posOrderUnRecur(head);

    }

}

猜你喜欢

转载自blog.csdn.net/qq_38200548/article/details/81296437
今日推荐