力扣.199二叉樹的右視圖-java深度優先(DFS)與廣度優先(BFS)算法

題目:

給定一棵二叉樹,想象自己站在它的右側,按照從頂部到底部的順序,返回從右側所能看到的節點值。

示例:
輸入: [1,2,3,null,5,null,4]
輸出: [1, 3, 4]
解釋:1            <---
 /   \
2     3         <---
 \     \
  5     4       <---

解法一

思路:

利用樹的廣度優先遍歷BFS,遍歷每層的最後一個節點,將其存放到list集合中

代碼:

 public static List<Integer> rightSideView(TreeNode root) {
        //定義存放結果的集合
        List<Integer> ret = new ArrayList<>();
        //判斷樹是否爲空
        if (root == null){
            return ret;
        }
        //定義隊列存放待查詢的節點
        Queue<TreeNode> nodes=new LinkedList<>();
        //樹根入隊
        nodes.offer(root);
        //層次遍歷(BFS廣度優先遍歷)
        while (!nodes.isEmpty()){
            int size = nodes.size();
            //循環當前層,從左往右出隊
            for (int i = 0; i < size; i++) {
                TreeNode node = nodes.poll();
                //判斷當前節點左子樹
                if (node.left!=null){
                    nodes.offer(node.left);
                }
                //判斷當前節點右子樹
                if (node.right!=null){
                    nodes.offer(node.right);
                }
                //到達當前層最右節點
                if (i == size-1){
                    ret.add(node.val);
                }
            }
        }
        return ret;
    }

解法二

思路:

採用深度優先遍歷dfs,即我們按照 「根結點 -> 右子樹 -> 左子樹」 的順序訪問, 就可以保證每層都是最先訪問最右邊的節點的。利用遞歸就可以遍歷整個樹結構。

代碼:

 //定義list集合
   List<Integer> ret = new ArrayList<>();
 //後序遍歷
    public List<Integer> rightSideView1(TreeNode root){
        dfs(root,0);
        return list2;
    }private void dfs(TreeNode root, int i) {
        if (root==null){
            return;
        }
        //先訪問當前層的節點,再遞歸右子樹,左子樹
        if (i==list2.size()){
            list2.add(root.val);
        }
        i++;
        dfs(root.right,i);
        dfs(root.left,i);
    }

以上兩種遍歷樹的方法,均十分重要,博主建議小夥伴們牢記深度優先dfs和廣度優先bfs遍歷樹的算法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章