一、题目描述
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
二、代码思路
其实有两种方法:
1、 使用dfs算法,先遍历右子树。
2、当最右侧右子树遍历完成之后,如果还存在高度比较高的子树,我们仍然需要遍历。
3、此时,我们开始回溯,并实时更新当前子树的高度,如果当前子树高度,高于之前遍历过的子树,那么就相当于从右边能够看到。
描述的可能不太清楚,请看代码。
第二种方法:
1、使用BFS层序遍历。
2、然后每一层,我们只取最右边的那个。
三、代码题解
/**
* Definition for a binary tree node.
* public 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;
* }
* }
*/
class Solution {
private List<Integer> res = new ArrayList();
private int curHeight = 0;
private void rightDFS(TreeNode node, int height) {
height++;
if (height > curHeight) {
curHeight = height;
res.add(node.val);
}
if (node.right != null) {
rightDFS(node.right,height);
}
if (node.left != null) {
rightDFS(node.left,height);
}
return;
}
public List<Integer> rightSideView(TreeNode root) {
//边界值判断
if (root == null) return res;
//优先遍历右子树
rightDFS(root,curHeight);
return res;
}
}