給定一棵二叉樹,想象自己站在它的右側,按照從頂部到底部的順序,返回從右側所能看到的節點值。
示例:
輸入: [1,2,3,null,5,null,4]
輸出: [1, 3, 4]
解釋:
1 <---
/ \
2 3 <---
\ \
5 4 <---
解題思路
樹的遍歷,題目要求返回樹最又層的那一列,首先想到的是DFS和BFS,因為不知道每個分支的深度,所以在DFS深度遍歷時,要記得當前深度有沒有記錄過最右邊的節點,同理在BFS寬度遍歷時,也要確保最右側的節點被記錄過。
DFS解法
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
int depth = 0;
dfs(list,root,depth);
return list;
}
private void dfs(List<Integer> list,TreeNode root,int depth)
{
if(root != null)
{
if(depth == list.size())
{
list.add(root.val);
}
depth++;
dfs(list,root.right,depth);//優先訪問右側節點
dfs(list,root.left,depth);
}
}
}
BFS解法
class Solution {
public List<Integer> rightSideView(TreeNode root){
List<Integer> list = new ArrayList<Integer>();
Queue<TreeNode> queue = new LinkedList<TreeNode>();
if(root == null) return list;
queue.offer(root);
while(!queue.isEmpty())
{
//獲取一層中最右邊的那個節點
int size = queue.size(); //提前算出來大小,因為大小時刻在變
for(int i=0;i<size;i++)
{
TreeNode node = queue.poll();
if(i == size -1)
{
if(node != null) list.add(node.val);
}
if(node.left != null) queue.offer(node.left);
if(node.right != null) queue.offer(node.right);
}
}
return list;
}
}
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/binary-tree-right-side-view
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。