廣度優先遍歷和深度優先遍歷


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;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM