0%

leetcode 199 Solution

代码解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package com.demo.s199;


import java.util.*;

/**
* 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
*
*
*/

class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}

public class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> ret = new ArrayList<>();
if(root == null) {
return ret;
}

int max_dep = -1;
//右分支视图按层输出
Map<Integer,Integer> rightViewAtDepth = new HashMap<Integer, Integer>();
//节点压栈
Stack<TreeNode> nodeStack = new Stack<>();
nodeStack.push(root);
//深度压栈
Stack<Integer> depthStack = new Stack<>();
depthStack.push(0);
while(nodeStack.size() != 0 ) {
//节点弹栈
TreeNode node = nodeStack.pop();
//深度弹栈
Integer dep = depthStack.pop();
if(node != null) {
//最大深度
max_dep = Math.max(dep, max_dep);
//右视图未遍历到该层,第一次遍历到的一定是右节点
if(!rightViewAtDepth.containsKey(dep)) {
//存入视图
rightViewAtDepth.put(dep, node.val);
}
//左节点压栈
nodeStack.push(node.left);
//右节点压栈
nodeStack.push(node.right);
//层数存入深度栈
depthStack.push(dep + 1);
//层数存入深度栈
depthStack.push(dep + 1);
}
}

//遍历深度
for(int i = 0 ;i <= max_dep; i++) {
Integer val = rightViewAtDepth.get(i);
ret.add(val);
}
return ret;
}
}