0x01.问题
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:1 <--- / \ 2 3 <--- \ \ 5 4 <---
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public List<Integer> rightSideView(TreeNode root)
0x02.简要分析
观察一下问题,问题比较好理解,右视图看到的二叉树结点就是从右边看到的第一个结点。
虽说问题比较好理解,但是真的马上去做的话,发现特殊的情况还是比较的多,这就说明,我们想的还不是最好的办法。
首先,用深搜是完全可以的,关键看怎么去找出最右边的那个结点。
我们再仔细一想,于是可以发现一个特点,这些个结点都是二叉树每一层的最右边的结点。
- 如果我们在深度搜索的时候,每次都先去访问右边的结点,那么访问到某一层时,第一个结点一定是这个最右边的结点,再用哈希表存起来,如果这一层存在了一个结点,那么就不再加入哈希表。
- 由于这个视图与二叉树的深度有关系,所以,还需要维护一个最大深度,需要一个实时的栈。
0x03.解决代码–深搜(栈)
class Solution {
public List<Integer> rightSideView(TreeNode root) {
Map<Integer,Integer> rightMaxDepth=new HashMap<>();
int maxDepth=-1;
Stack<TreeNode> nodeStack = new Stack<>();
Stack<Integer> depthStack = new Stack<>();
nodeStack.push(root);
depthStack.push(0);
while(!nodeStack.isEmpty()){
TreeNode node=nodeStack.pop();
int depth=depthStack.pop();
if(node!=null){
maxDepth=Math.max(maxDepth,depth);
if(!rightMaxDepth.containsKey(depth)){
rightMaxDepth.put(depth,node.val);
}
nodeStack.push(node.left);
nodeStack.push(node.right);
depthStack.push(depth+1);
depthStack.push(depth+1);
}
}
List<Integer> rightView=new ArrayList<>();
for(int i=0;i<=maxDepth;i++){
rightView.add(rightMaxDepth.get(i));
}
return rightView;
}
}
ATFWUS --Writing By 2020–04-22