zoukankan      html  css  js  c++  java
  • java程序二叉树的深度优先和广度优先遍历

    package com.springboot.study.tests.trees;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    /**
     * @Author: guodong
     * @Date: 2021/12/24 17:03
     * @Version: 1.0
     * @Description:
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class TreeNode {
    
        public int val;
    
        public TreeNode left;
    
        public TreeNode right;
    
    }
    package com.springboot.study.tests.trees;
    
    import java.util.*;
    
    /**
     * @Author: guodong
     * @Date: 2021/12/24 17:05
     * @Version: 1.0
     * @Description:
     */
    public class binaryTree {
    
        public static void main(String[] args) {
            List<Integer> list=new ArrayList<Integer>();
            //构造二叉树
            TreeNode treeNode6=new TreeNode(2,null,null);
            TreeNode treeNode5=new TreeNode(1,null,null);
            TreeNode treeNode4=new TreeNode(7,null,null);
            TreeNode treeNode3=new TreeNode(6,treeNode5,treeNode6);
            TreeNode treeNode2=new TreeNode(5,treeNode4,null);
            TreeNode root=new TreeNode(3,treeNode2,treeNode3);
            list=DFS(root);
            System.out.println("深度优先遍历:"+list);
            list=BFS(root);
            System.out.println("广度优先遍历:"+list);
        }
    
        /**
         * 深度优先遍历
         * @param root
         * @return
         */
        public static List<Integer> DFS(TreeNode root){
            Stack<TreeNode> stack=new Stack<TreeNode>();
            List<Integer> list=new ArrayList<Integer>();
            if(root==null)
                return list;
            stack.push(root);
            while (!stack.isEmpty()){
                TreeNode t=stack.pop();
                if(t.right!=null){ stack.push(t.right); }
                if(t.left!=null){ stack.push(t.left); }
                list.add(t.val);
            }
            return list;
        }
    
        /**
         * 广度优先遍历
         * @param root
         * @return
         */
        public static List<Integer> BFS(TreeNode root){
            Queue<TreeNode> queue=new LinkedList<TreeNode>();
            List<Integer> list=new ArrayList<Integer>();
            if(root==null){return list;}
            queue.add(root);
            while (!queue.isEmpty()){
                TreeNode t=queue.remove();
                if(t.left!=null){ queue.add(t.left); }
                if(t.right!=null){ queue.add(t.right); }
                list.add(t.val);
            }
            return list;
        }
    
    
    }

    1. 图的深度优先遍历是指,从⼀个节点出发,⼀直沿着边向下深⼊去找节点,如果找不到了则返回上⼀层找其他节点
    2. 图的⼴度优先遍历只是,从⼀个节点出发,向下先把第⼀层的节点遍历完,再去遍历第⼆层的节点,直到遍历到最后⼀层
    二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。
    深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历、中序遍历、后序遍历。具体说明如下:
    先序遍历:对任一子树,先访问根,然后遍历其左子树,最后遍历其右子树。
    中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树。
    后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。
    广度优先遍历:又叫层次遍历,从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问结点,访问完一层就进入下一层,直到没有结点可以访问为止。

    郭慕荣博客园
  • 相关阅读:
    U8自动、手动备份不成功 “远程组件初始化失败”
    关于延迟时间的一点智慧
    xe 最大连接数限制、记录客户连接、心跳
    应用开发框架之——根据数据表中的存储的方法名称来调用方法
    固定资产卡片管理累计折旧数不准确
    整理表索引
    用友U8固定资产总账重算语句
    新建自定义报表发布到普通菜单节点流程
    怎么更改月折旧率的小数位
    重建数据库索引等SQL常用语句
  • 原文地址:https://www.cnblogs.com/jelly12345/p/15728237.html
Copyright © 2011-2022 走看看