JustRun

二叉树

2020-07-19  本文已影响0人  JustFlipped

二叉树

概念

完全二叉树

堆也是一种利用了完全二叉树的结构。

完全二叉树

二叉树存储

链式存储

通过数据、左右指针来存储,然后通过根节点将整个树串起来

class BinaryNode<T> {
    private T element;
    private BinaryNode<T> left;
    private BinaryNode<T> right;
}

顺序存储(数组)

通过数组下标定位节点,节点 X 的下标为 i,则他的左子节点下标为 2*i,右子节点下标为 2*i + 1,可以发现如果是非完全二叉树就会存在浪费存储空间的情况了。例如:E 右子节点下标为 11,数组下标为 10 的位置就浪费了。

二叉树的遍历

前中后是相对于当前节点被访问的书序来说的。遍历的时间复杂度是 O(n)

/*************************
* 二叉树的遍历,递归实现  **
*************************/
//先序遍历
public void preOrderTraversalRec(BinaryNode root) {
    if (root != null) {
        System.out.print(root.getElement() + "-");
        preOrderTraversalRec(root.getLeft());
        preOrderTraversalRec(root.getRight());
    }
}

//中序遍历
public void inOrderTraversalRec(BinaryNode root) {
    if (root != null) {
        inOrderTraversalRec(root.getLeft());
        System.out.print(root.getElement() + "-");
        inOrderTraversalRec(root.getRight());
    }
}

//后序遍历
public void postOrderTraversalRec(BinaryNode root) {
    if (root != null) {
        postOrderTraversalRec(root.getLeft());
        postOrderTraversalRec(root.getRight());
        System.out.print(root.getElement() + "-");
    }
}

/*************************
* 二叉树的遍历,非递归实现  **
*************************/
//先序遍历
public void preOrderTraversal(BinaryNode root) {
    Stack<BinaryNode> stack = new Stack<>();
    BinaryNode current = root;
    while (current != null || !stack.empty()){
        if (current != null){
            System.out.print(current.getElement() + "-");
            stack.push(current);
            current = current.getLeft();
        } else {    //当访问到最左边的孩子后开始访问右孩子
            current = stack.pop();
            current = current.getRight();
        }
    }
}

//中序遍历
public void inOrderTraversal(BinaryNode root) {
    Stack<BinaryNode> stack = new Stack<>();
    BinaryNode current = root;
    while (current != null || !stack.empty()) {
        if (current != null) {        //从根节点开始,如果当前节点有左孩子,则入栈。包括最左孩子节点
            stack.push(current);
            current = current.getLeft();
        } else {
            current = stack.pop();
            System.out.print(current.getElement() + "-");
            current = current.getRight();
        }
    }
}

//后序遍历
public void postOrderTraversal(BinaryNode root) {
    Stack<BinaryNode> stack = new Stack<>();
    Stack<BinaryNode> outStack = new Stack<>();
    BinaryNode current = root;
    while (current != null || !stack.empty()){
        if (current != null){
            outStack.push(current);
            stack.push(current);
            current = current.getRight();
        } else {
            current = stack.pop();
            current = current.getLeft();
        }
    }
    while (!outStack.empty()){
        System.out.print(outStack.pop().getElement() + "-");
    }
}
上一篇下一篇

猜你喜欢

热点阅读