題目:
給定一棵二叉樹,想象自己站在它的右側,按照從頂部到底部的順序,返回從右側所能看到的節點值。
示例:
輸入: [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遍歷樹的算法