二叉树三种遍历方式 非递归

本文介绍了如何使用Java编程实现二叉树的先序(Pre-order)、中序(In-order)和后序(Post-order)遍历算法,通过栈的数据结构实现递归调用的替代,适合初学者理解基本的二叉树遍历概念。
摘要由CSDN通过智能技术生成
import java.util.*;
public class BinaryTree {
    static  class Node{
        Node left;
        Node right;
        int val;
        public Node (int val,Node left, Node right) {
            this.left = left;
            this.right = right;
            this.val = val;
        }
    }
    public static void main(String args[]){
        Node node9=new Node(9,null,null);
        Node node2=new Node(2,null,null);
        Node node1=new Node(1,null,null);
        Node node6=new Node(6,node9,node2);
        Node node4=new Node(4,node1,null);
        Node root=new Node(5,node6,node4);
        inOrder(root);
        preOrder(root);
        postOrder(root);


    }

    /**
     * 先序
     * @param root
     */
    static void preOrder(Node root){
        Stack<Node> stack=new Stack<>();
        if(root==null) return ;
        stack.push(root);
        while(!stack.isEmpty()){
            //先访问
            Node node=stack.pop();
            System.out.print(node.val+"\t");
            if(node.right!=null) stack.push(node.right);//先将右子树入栈
            if(node.left!=null) stack.push(node.left);//再将左子树入栈

        }
        System.out.println("");
    }

    static void inOrder(Node root){
        Stack<Node> stack=new Stack<>();
        Node currentNode=root;
        if(root==null) return;
        //入栈
        stack.push(root);
        while(!stack.isEmpty()){
            while(currentNode.left!=null){
                stack.push(currentNode.left);
                currentNode=currentNode.left;
            }
            //访问第一个元素
            currentNode=stack.pop();
            System.out.print(currentNode.val+"\t");
            if(currentNode.right!=null){
                //入栈
                stack.push(currentNode.right);
                currentNode=currentNode.right;
            }
        }
        System.out.println("");

    }


    /**
     * 后序遍历 就是先序遍历 左右孩子的入栈顺序调换一下,再加一个辅助栈, stack1出来一个stack2进入一个,最后打印stacl2即可
     * @param root
     */
    static void  postOrder(Node root){
        if(root != null){
            Stack<Node> s1 = new Stack<Node>();
            Stack<Node> s2 = new Stack<Node>();
            s1.push(root);
            while(!s1.isEmpty()){
                root = s1.pop();
                s2.push(root);
                if(root.left != null){
                    s1.push(root.left);
                }
                if(root.right != null){
                    s1.push(root.right);
                }
            }
        }
        System.out.println("");

    }





}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值