算法-----树的遍历

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/omyrobin/article/details/85279953

前序遍历—递归方式

public void preOrder(BaseTreeNode node) {
    if(node == null){
        return;
    }else{
        System.out.println("前序递归:   " + node.getNode());
        preOrder(node.leftChild);
        preOrder(node.rightChild);
    }
}

中序遍历—递归方式

public void middleOrder(BaseTreeNode node) {
   if(node == null){
        return;
    }else{
        middleOrder(node.leftChild);
        System.out.println("中序递归:   " + node.getNode());
        middleOrder(node.rightChild);
    }
}

后序遍历—递归方式

public void postOrder(BaseTreeNode node) {
   if(node == null){
        return;
    }else{
        postOrder(node.leftChild);
        postOrder(node.rightChild);
        System.out.println("后序递归:   " + node.getNode());
    }
}

层序遍历—队列方式

public void tierOrder(BaseTreeNode node) {
    Queue<BaseTreeNode> queue = new LinkedList<>();
    if(node == null){
        return;
    }
    queue.offer(node);
    while(queue.peek()!=null){
        BaseTreeNode n = queue.poll();
        System.out.println("层序队列:   "  + n.getNode());
        if(n.leftChild != null){
            queue.offer(n.leftChild);
        }
        if(n.rightChild != null){
            queue.offer(n.rightChild);
        }
    }
}

层序遍历—队列方式并输出每层层级

public void tierOrderHasHeight(BaseTreeNode node) {
    int i = 0;
    BaseTreeNode parent = node;
    BaseTreeNode last = null;
    Queue<BaseTreeNode> queue = new LinkedList<>();
    if(node == null){
        return;
    }
    queue.offer(node);
    while(queue.peek()!=null){
        BaseTreeNode n = queue.poll();
        System.out.println("层序队列:   "  + n.getNode());
        if(n.leftChild != null){
            queue.offer(n.leftChild);
            last = n.leftChild;
        }
        if(n.rightChild != null){
            queue.offer(n.rightChild);
            last = n.rightChild;
        }
        if(parent == n){
            System.out.println(++i);
            parent = last;
        }
    }
}

前序遍历—栈方式1

public void nonPreOrder(BaseTreeNode node) {
    if (node == null)
        return;
    Stack<BaseTreeNode> stack = new Stack<>();
    while(node != null || !stack.empty()) {
        while(node != null) {
            System.out.println("前序栈:   " + node.getNode());
            stack.push(node);
            node = node.leftChild;
        }
        if(!stack.empty()) {
            node = stack.pop();
            node = node.rightChild;
        }
    }
}

前序遍历—栈方式2

//栈的思想,按层次倒着进栈,利用后进先出解决顺序问题
public static void nonPreOrder2(BaseTreeNode node) {
    if (node == null)
        return;
    Stack<BaseTreeNode> stack = new Stack<>();
    stack.push(node);
    while (!stack.empty()) {
        node = stack.pop();
        System.out.println("前序栈2:   " + node.getNode());
        if (node.rightChild != null)
            stack.push(node.rightChild);
        if (node.leftChild != null)
            stack.push(node.leftChild);
    }
}

中序遍历—栈方式

public void nonMiddleOrder(BaseTreeNode node) {
    Stack<BaseTreeNode> stack = new Stack<>();
    while(node != null || !stack.empty()) {
        while (node != null) {
            stack.push(node);
            node = node.leftChild;
        }
        if(!stack.empty()) {
            node = stack.pop();
            System.out.println("中序栈:   "+node.getNode());
            node = node.rightChild;
        }
    }
}

后序遍历—栈方式1

public void nonPostOrder(BaseTreeNode node) {
    if (node == null) return;
    Stack<BaseTreeNode> stack = new Stack<>();
    BaseTreeNode prev = node;
    while (node != null || !stack.empty()) {
        while (node != null) {
            stack.push(node);
            node = node.leftChild;
        }
        node = stack.peek().rightChild;
        if (node == null || node == prev) {
            //若栈顶节点的右节点为空或者已经输出过,则按顺序应该访问栈顶节点
            node = stack.pop();
            System.out.println("后序栈:   " + node.getNode());
            //prev用来标记已经输出过这个节点
            prev = node;
            node = null;
        }
    }
}

后序遍历—栈方式2

public void nonPostOrder2(BaseTreeNode node) {
    if (node == null) return;
    Stack<BaseTreeNode> stack = new Stack<>();
    BaseTreeNode prev = node;
    while (node != null) {
        while (node.leftChild != null) {
            stack.push(node);
            node = node.leftChild;
        }
        while (node != null && (node.rightChild == null || node.rightChild == prev)) {
            System.out.println("后序栈:   " + node.getNode());
            prev = node;
            if (stack.empty()) return;
            node = stack.pop();
        }
        stack.push(node);
        node = node.rightChild;
    }
}

后序遍历—栈方式3(双栈模式)

public void nonPostOrder3(BaseTreeNode node) {
   if (node == null) return;
    //用来调整顺序
    Stack<BaseTreeNode> stack = new Stack<>();
    //用来最终输出
    Stack<BaseTreeNode> result = new Stack<>();
    while (!stack.empty() || node != null) {
        while (node != null) {
            stack.push(node);
            result.push(node);
            node = node.rightChild;
        }
        if (!stack.empty()){
            node = stack.pop().leftChild;
        }
    }
    while (!result.empty()) {
        node = result.pop();
        System.out.println("后序栈:   " + node.getNode());
    }
}

猜你喜欢

转载自blog.csdn.net/omyrobin/article/details/85279953