199. 二叉树的右视图 BFS+DFS递归/非递归

#199. 二叉树的右视图

难度:中等 2020/4/22每日一题打卡√
今天的每日一题又开始放水啦?

方法

    • #199. 二叉树的右视图
    • 1、BFS(层序遍历)
    • 2、DFS(非递归)
    • 3、DFS递归

题目描述
199. 二叉树的右视图 BFS+DFS递归/非递归_第1张图片
解题思路
这题一看,这不就是层序遍历嘛,每次把队列最后面的元素放到结果集合中。刷了这么多天题,最大的进步就是能熟练默写出BFS的代码了,以前上课的时候怎么都搞不懂,果然还得实践出真知,纸上得来终觉浅!

1、BFS(层序遍历)

官方的图不错,下一秒就是我的了
199. 二叉树的右视图 BFS+DFS递归/非递归_第2张图片

public List<Integer> rightSideView(TreeNode root) {
  	List<Integer> re = new LinkedList<Integer>();
  	if(root == null)
   		return re;
  	Queue<TreeNode> queue = new LinkedList<>();
  	queue.offer(root);
  	while(!queue.isEmpty()) {
	   	int n = queue.size();
	   	for (int i = 0; i < n; i++) {
	    		TreeNode temp = queue.poll();
	    		if(temp.left != null)
	     			queue.offer(temp.left);
	    		if(temp.right != null)
	     			queue.offer(temp.right);
	    		if(i == n-1) {
	     			re.add(temp.val);
	    		}
	   	}
	  }
	  return re;
    }

199. 二叉树的右视图 BFS+DFS递归/非递归_第3张图片

2、DFS(非递归)

dfs其实我还不是很熟悉,总有点搞不清楚,加油学习
思路就是每次先访问右边的节点并且记录深度,如果下一个深度大于当前深度,就说明遇到了新的右侧,加入到结果集合中。
199. 二叉树的右视图 BFS+DFS递归/非递归_第4张图片
非递归的版本,就是用栈来代替系统栈实现。因为要优先访问右边的节点,所以入站的时候先入栈左边的,再入栈右边的节点。这样出栈的时候就能先出栈最右边的节点,记录每个节点的深度,如果出现新的深度说明访问到了下一层最右边的节点,加入到结果集合中。

public List<Integer> rightSideView1(TreeNode root) {
  	List<Integer> re = new LinkedList<Integer>();
  	Stack<TreeNode> stack = new Stack<>();
  	Stack<Integer> depthStack = new Stack<Integer>();
  	int max = -1;
  	if(root == null)
   		return re;
  	stack.push(root);
  	depthStack.push(0);
  	while(!stack.isEmpty()) {
   		TreeNode temp = stack.pop();
   		int curdepth = depthStack.pop();
   		if (curdepth > max) {
    			re.add(temp.val);
    			max = curdepth;
   		}
   		if (temp.left != null) {
    			stack.push(temp.left);
    			depthStack.push(curdepth+1);
   		}
   		if (temp.right != null) {
    			stack.push(temp.right);
    			depthStack.push(curdepth+1);
   		}
  	}
  	return re;
    }

199. 二叉树的右视图 BFS+DFS递归/非递归_第5张图片

3、DFS递归

递归的代码简洁很多呀

public List<Integer> rightSideView2(TreeNode root) {
  	List<Integer> re = new LinkedList<Integer>();
  	if(root == null)
   		return re;
  	dfs(re,root,0);
  	return re;
    }
 public void dfs(List<Integer> re,TreeNode root,int depth) {
  	if(depth > re.size()) {  //如果这个节点深度超过已经记录的节点数,说明是最右边的那个
   		re.add(root.val);
  	}
  	if(root.right != null)  //先访问右边的节点
   		dfs(re, root.right, depth+1);
  	if(root.left != null)
   		dfs(re, root.left, depth+1);
 }

199. 二叉树的右视图 BFS+DFS递归/非递归_第6张图片

你可能感兴趣的:(力扣刷题笔记)