linuxsir首页 LinuxSir.Org | Linux、BSD、Solaris、Unix | 开源传万世,因有我参与欢迎您!
网站首页 | 设为首页 | 加入收藏
您所在的位置:主页 > Linux基础建设 >

Java实现二叉树的遍历

时间:2017-10-19  来源:未知  作者:admin666

Java实现二叉树的遍历

public class BinaryTreeNode {
    int value;
    BinaryTreeNode left;
    BinaryTreeNode right;
 
    // 前序遍历
    public static void preOrder(BinaryTreeNode tree) {
        if (tree == null)
            return;
        System.out.print(tree.value + " ");
        preOrder(tree.left);
        preOrder(tree.right);
    }
 
    /**
    * 二叉树前序遍历的循环实现方式
    * 
    * @param tree
    */
    public static void preOrderLoop(BinaryTreeNode tree) {
        if (tree == null)
            return;
        Stack<BinaryTreeNode> stack = new Stack<BinaryTreeNode>();
        BinaryTreeNode node = tree;
 
        while (node != null || !stack.isEmpty()) {
            if (node != null) {
                stack.push(node);
                System.out.print(node.value + " ");
                node = node.left;
            } else {
                BinaryTreeNode item = stack.pop();
                node = item.right;
            }
        }
    }
 
    // 中序遍历
    public static void inOrder(BinaryTreeNode tree) {
        if (tree == null)
            return;
        inOrder(tree.left);
        System.out.print(tree.value + " ");
        inOrder(tree.right);
    }
 
    /**
    * 二叉树中序遍历的循环实现
    * 
    * @param tree
    */
    public static void inOrderLoop(BinaryTreeNode tree) {
        if (tree == null)
            return;
        Stack<BinaryTreeNode> stack = new Stack<BinaryTreeNode>();
        BinaryTreeNode node = tree;
 
        while (node != null || !stack.empty()) {
            if (node != null) {
                stack.push(node);
                node = node.left;
            } else {
                BinaryTreeNode item = stack.pop();
                System.out.print(item.value + " ");
                node = item.right;
            }
        }
    }
 
    // 后序遍历
    public static void postOrder(BinaryTreeNode tree) {
        if (tree == null)
            return;
        postOrder(tree.left);
        postOrder(tree.right);
        System.out.print(tree.value + " ");
    }
 
    /**
    * 二叉树后序遍历的循环实现
    * 
    * @param tree
    */
    public static void postOrderLoop(BinaryTreeNode tree) {
        if (tree == null)
            return;
        HashSet<BinaryTreeNode> visited = new HashSet<BinaryTreeNode>();
        Stack<BinaryTreeNode> stack = new Stack<BinaryTreeNode>();
        BinaryTreeNode node = tree;
 
        while (node != null || !stack.isEmpty()) {
            if (node != null) {
                stack.push(node);
                node = node.left;
            } else {
                BinaryTreeNode item = stack.peek();
                if (item.right != null && !visited.contains(item.right))
                    node = item.right;
                else {
                    System.out.print(item.value + " ");
                    visited.add(item);
                    stack.pop();
                }
            }
        }
    }
 
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<Integer>();
        List<Integer> list2 = new ArrayList<Integer>();
 
        list1.add(1);
        list1.add(2);
        list1.add(4);
        list1.add(7);
        list1.add(3);
        list1.add(5);
        list1.add(6);
        list1.add(8);
 
        list2.add(4);
        list2.add(7);
        list2.add(2);
        list2.add(1);
        list2.add(5);
        list2.add(3);
        list2.add(8);
        list2.add(6);
 
        BinaryTreeNode tree = BinaryTreeNode.Construct(list1, list2);
        BinaryTreeNode.preOrderLoop(tree);
        System.out.println();
        BinaryTreeNode.inOrderLoop(tree);
        System.out.println();
        BinaryTreeNode.postOrderLoop(tree);
    }
 
}

友情链接