241 阅读2分钟

高度 深度 层

二叉树

前序遍历 中序遍历 后序遍历 深度遍历 广度遍历

完全二叉树

满二叉树

树的高度h=log2(n)

二叉查找树

中序遍历为从大到小排列 ,二叉排序树O(n) 查找 时间复杂度 o(h) 树的高度 o(n) - O(log(n))

平衡二叉查找树

AVG树
红黑树

完全二叉树

存储方式

数组

##链表

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }

    public void setValue(int x) {
        val = x;
    }
}

public class BiTree {
    public TreeNode root = null;

    public BiTree(int[] args, int i) {
        root = preCreate(args, i);
        root = stackCreate(args);
    }

    private TreeNode preCreate(int[] args, int i) {
        TreeNode node = null;
        if (i < args.length) {
            int value = args[i];
            node = new TreeNode(value);
            node.left = preCreate(args, 2 * i + 1);
            node.right = preCreate(args, 2 * i + 2);
        }
        return node;
    }

    private TreeNode stackCreate(int[] args) {
        LinkedList q = new LinkedList();
        int i = 0;
        TreeNode root = new TreeNode(args[0]);
        q.offer(root);
        while (!q.isEmpty()) {
            TreeNode node = (TreeNode) q.poll();
            if (i < args.length / 2) {
                TreeNode left = new TreeNode(args[i * 2 + 1]);
                TreeNode right = new TreeNode(args[i * 2 + 2]);
                node.left = left;
                node.right = right;
                q.offer(left);
                q.offer(right);
                i++;
            }
        }
        return root;
    }

    public void preOrder(TreeNode root) {
        if (root != null) {
            showData(root);
            preOrder(root.left);
            preOrder(root.right);
        }
    }

    public void inOrder(TreeNode root) {
        if (root != null) {
            inOrder(root.left);
            showData(root);
            inOrder(root.right);
        }
    }

    public void postOrder(TreeNode root) {
        if (root != null) {
            postOrder(root.left);
            postOrder(root.right);
            showData(root);
        }
    }

    private void showData(TreeNode node) {
        System.out.println(node.val);
    }

    public void noRecursionPreOrder(TreeNode node) {
        Stack stack = new Stack();
        if (node != null) {
            stack.push(node);
            while (!stack.empty()) {
                node = (TreeNode) stack.pop();
                showData(node);
                if (node.right != null) {
                    stack.push(node.right);
                }
                if (node.left != null) {
                    stack.push(node.left);
                }
            }
        }
    }

    // 寻找最深左节点,入栈;
    // 出栈,输出
    // 指向右节点
    public void noRecursionInOrder(TreeNode node) {
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode p = node;
        while (p != null || stack.size() > 0) {
            while (p != null) {
                stack.push(p);
                p = p.left;
            }
            if (stack.size() > 0) {
                p = stack.pop();
                showData(p);
                p = p.right;
            }
        }
    }


    public void noRecursionPostOrder(TreeNode node) {
        Stack<TreeNode> stack = new Stack();
        TreeNode p = node;
        TreeNode prev = null;
        while (p!= null || stack.size() > 0) {
            if (p!= null) {
                stack.push(p);
                p = p.left;
            }
            while (stack.size() > 0) {
                if (stack.peek().right == null || stack.peek().right == prev) {
                    TreeNode w = stack.pop();
                    showData(w);
                    prev = w;
                } else {
                    stack.push(stack.peek().right);
                    break;
                }
            }
        }
    }

    //利用栈, 根右左出栈,队列首插入,得到结果.
    public void noRecursionPostOrder2(TreeNode node) {

    }

    public void noRecursionLevelOrder(TreeNode node) {
        LinkedList<TreeNode> l = new LinkedList<TreeNode>();
        TreeNode p = node;
        l.offer(p);
        while (l.size() > 0) {
            p = l.poll();
            showData(p);
            if (p.left != null) {
                l.offer(p.left);
            }
            if (p.right != null) {
                l.offer(p.right);
            }
        }
    }

    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        BiTree tree = new BiTree(arr, 0);
//        tree.preOrder(tree.root);
//        tree.inOrder(tree.root);
//        tree.postOrder(tree.root);
//        System.out.println();
//        tree.noRecursionPreOrder(tree.root);
//        tree.noRecursionInOrder(tree.root);
//        tree.noRecursionPostOrder(tree.root);
        tree.noRecursionLevelOrder(tree.root);
    }
}