算法系列-----树的遍历

前序遍历—递归方式

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());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值