zoukankan      html  css  js  c++  java
  • 二叉树之前序、中序、后序、层序遍历

    二叉树的遍历

    二叉树的表示

    //Java
    public class TreeNode{
        int val;
        Node left,right;
        public Node(int val){
            this.val=val;
        }
    }
    

    前序遍历

    递归方法

        public static void preOrder1(TreeNode root){
            if(root == null)
                return;
            System.out.println(root.val);
            preOrder1(root.left);
            preOrder1(root.right);
        }
    

    非递归方法

        public static void preOrder2(TreeNode root){
            Stack<TreeNode>  stack = new Stack<>();
            TreeNode node = root;
            while(node != null || !stack.empty()){
                if(node != null){
                    System.out.println(node.val);
                    stack.push(node);
                    node = node.left;
                }else{
                    node = stack.pop();
                    node = node.right;
                }
            }
        }
    

    中序遍历

    递归方法

        public static void inOrder1(TreeNode root){
            if(root == null)
                return;
            inOrder1(root.left);
            System.out.println(root.val);
            inOrder1(root.right);
        }
    

    非递归方法

        //非递归方法
        public static void inOrder2(TreeNode root){
            Stack<TreeNode> stack = new Stack<TreeNode>();
            TreeNode node= root;
            while(node != null || !stack.empty()){
                if(node != null){
                    stack.push(node);
                    node = node.left;
                }else {
                    node = stack.pop();
                    System.out.println(node.val);
                    node = node.right;
                }
            }
        }
    

    后序遍历

    递归方法

        public static void postOrder1(TreeNode root){
            if(root == null)
                return;
            postOrder1(root.left);
            postOrder1(root.right);
            System.out.println(root.val);
        }
    

    非递归方法

        //非递归方法
        public static void postOrder2(TreeNode root){
            Stack<TreeNode> stack  = new Stack<TreeNode>();
            TreeNode node = root;
            TreeNode lastNode = root;
            while(node != null || !stack.empty()){
                while(node != null){
                    stack.push(node);
                    node = node.left;
                }
    
                node = stack.peek();
    
                if(node.right == null || node.right == lastNode){
                    System.out.println(node.val);
                    stack.pop();
                    lastNode = node;
                    node = null;
                }else {
                    node = node.right;
                }
    
    
            }
    

    层序遍历

     public static void LevelorderTraversal ( TreeNode root )
     {
         LinkedList<TreeNode> Q = new LinkedList<TreeNode>();
         TreeNode node = root;
    
         if ( node == null ) return; /* 若是空树则直接返回 */
         Q.offer(node);
    
         while ( !Q.isEmpty() ) {
             node = Q.poll();
             System.out.println( node.val ); /* 访问取出队列的结点 */
             if ( node.left != null )   Q.offer(node.left);
             if ( node.right != null )   Q.offer(node.right);
         }
    }
    
  • 相关阅读:
    常看本地是否安装Git和maven工具
    Git 安装和使用Tips
    Jmeter 获取系统时间,和对系统时间进行增减时间
    Java 中的系统时间
    Go语言
    数据拆分之 垂直拆分 and 水平拆分
    在Windows和UNIX下利用PHP和LDAP进行身份验证
    Linux中使用crontab命令定时执行shell脚本或其他Linux命令
    php empty()和isset()的区别
    php 判断是否get传值的参数是否存在
  • 原文地址:https://www.cnblogs.com/0ffff/p/11095250.html
Copyright © 2011-2022 走看看