zoukankan      html  css  js  c++  java
  • 广度优先遍历和深度优先遍历

    1 广度优先遍历

    1.1 概念

    ①以初始节点V0作为第一层节点,接着访问它。
    ②然后迭代第一层节点即V0,访问它相邻接的没有访问过的节点比如V1,V2,V1,V2加入到第二层节点
    ③迭代第二层节点V1,V2,V1,V2依次访问相邻接的没有访问过的节点,重复上述步骤直至所有节点都被访问过为止。

    1.2图解

    如图所示首先访问根节点v0,并将v0加入到第一层。迭代第一层节点,和vo相邻接的没有访问过的节点有v1和v2,访问v1和v2,并将v1和v2加入到第二层,迭代第二层中的节点v1和v2,和v1相邻接的没有访问过的节点有v3,v4,访问v3和v4,并加入到第三层,和v2相邻接的没有访问过的节点有v5和v6,访问v5和v6,并加入到第三层。

    1.3代码

    public class BFSDemo {
    
        public void bfs(TreeNode root) {
            if(root == null) {
                return;
            }
            Queue<TreeNode> q = new LinkedList<>();
            q.offer(root);
            int size = q.size();
            TreeNode temp = null;
            while(!q.isEmpty()){
                size = q.size();
                while(size>0){
                    temp = q.poll();
                    if(temp.left != null){
                        q.offer(temp.left);
                    }
                    if(temp.right != null){
                        q.offer(temp.right);
                    }
                    size--;
                }
               
            }
            return;
        }
    

    2.深度优先遍历

    2.1概念

    ①从给定的一个节点v0作为起点,访问它。
    ②以v0作为起点,找到一个和它相邻且未被访问过节点v1,重复上述步骤。
    ③当到达一个节点vi,它所有相邻的节点都被访问过,那么就回退到vi-1,去找和它相邻且未被访问过节点。重复这一步,直到访问过的顶点在也找不到和它相邻且未被访问过的节点。

    2.2图解

    ①v0->v1->v3
    ②回退到v1,->v3
    ③回退到v0, ->v2->v5
    ④回退到v2, ->v6

    2.3代码

    public class DFSDemo {
    
        public void dfs(TreeNode root) {
            if(root == null ) {
                return;
            }
            dfs(root.left);
            dfs(root.right);
            return;
        }
    }
    

    3例题

    给定一个二叉树,找出其最大深度。

    二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

    说明: 叶子节点是指没有子节点的节点。

    示例:
    给定二叉树 [3,9,20,null,null,15,7]
    返回它的最大深度 3 。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    3.1分析

    可以采用广度优先遍历,第一层深度为1,每增加一层深度加一
    也可以采用深度优先遍历,访问每个节点时判断它和最大深度之间的大小。或者计算左子树深度和右子树的深度,取他们之间的最大值然后加1。

    public class BFSDemo {
    
        public int maxDepth(TreeNode root) {
            if(root == null) {
                return 0;
            }
            Queue<TreeNode> q = new LinkedList<>();
            q.offer(root);
            int size = q.size();
            TreeNode temp = null;
            int level = 0;
            while(!q.isEmpty()){
                size = q.size();
                while(size>0){
                    temp = q.poll();
                    if(temp.left != null){
                        q.offer(temp.left);
                    }
                    if(temp.right != null){
                        q.offer(temp.right);
                    }
                    size--;
                }
                level++;
            }
            return level;
        }
    }
    
    
    public class DFSDemo {
    
        int max = 0;
        public int maxDepth(TreeNode root) {
            if(root == null){
                return 0;
            }
    
            dfs(root,1);
            return max;
        }
        public void dfs(TreeNode node, int level){
            if(node.left == null && node.right == null&&level>max){
                max = level;
            }
            if(node.left != null){
                dfs(node.left,level+1);
            }
            if(node.right != null){
                dfs(node.right,level+1);
            }
        }
    }
    
    
    public class DFSDemo {
    
        public int maxDepth(TreeNode root) {
            if(root == null) {
                return 0;
            }
            int left = maxDepth(root.left);
            int right = maxDepth(root.right);
            return Math.max(left,right) + 1;
        }
    }
    

    作者:pavi

    出处:http://www.cnblogs.com/pavi/

    本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!

    如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!

  • 相关阅读:
    linux sed
    低版本的 opencv库的 vs2010 打开 高版本opencv
    跨,跨,跨,我的2013半年总结
    收集用户行为
    文章17周项目2--通过基准线结合(三个数字排序(指针参数))
    Ubuntu下一个python的BeautifulSoup和rsa安装方法---信息检索project2部分:微博爬行要求python包裹
    HTML_ul无序列表
    左右Cwnd::Create()功能出现afxwin1.inl line:21错误的解决方案
    rac下一个/tmp/bootstrap权限问题
    C 删除字符串1字符串2
  • 原文地址:https://www.cnblogs.com/pavi/p/13433433.html
Copyright © 2011-2022 走看看