给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
示例 2:
输入: [1,2,3,4,null,null,null,7]
输出: [1,3,4,7]
示例 3:
输入: [1,null,3]
输出: [1,3]
示例 4:
输入: []
输出: []
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-tree-right-side-view
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
感谢大神数据结构和算法的详细解法,传送门BFS和DFS两种方式解决
class Solution {
public List<Integer> rightSideView(TreeNode root) {
// return rightSideViewI(root);
// return rightSideViewII(root);
return rightSideViewIII(root);
}
//方法三:BFS层序遍历,每一层最后一个节点就是需要的节点
//时间和空间复杂度O(N)
private List<Integer> rightSideViewIII(TreeNode root) {
List<Integer> list = new ArrayList<>();
if (root == null) {
return list;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
while (size-- > 0) {
TreeNode node = queue.poll();
if (size == 0) {
list.add(node.val);
}
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
}
return list;
}
//方法一:定义两个栈,一个保存节点,一个保存当前节点所在的层数
//时间和空间复杂度O(N)
//因为是右视图,所以从根节点开始往右子树遍历,而每一层最先遍历的节点就是从右边最先看到的节点
private List<Integer> rightSideViewI(TreeNode root) {
List<Integer> list = new ArrayList<>();
if (root == null) {
return list;
}
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
Stack<Integer> levelStack = new Stack<>();
levelStack.push(0);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
int level = levelStack.pop();
//每一层最先遍历的节点就是我们需要的值
if (list.size() == level) {
list.add(node.val);
}
//这里先访问左子树,出栈时则是右子树
if (node.left != null) {
stack.push(node.left);
levelStack.push(level + 1);
}
if (node.right != null) {
stack.push(node.right);
levelStack.push(level + 1);
}
}
return list;
}
//方法二:与方法一思路一致,使用递归实现
//时间和空间复杂度O(N)
private List<Integer> rightSideViewII(TreeNode root) {
List<Integer> list = new ArrayList<>();
if (root == null) {
return list;
}
traverse(root, list, 0);
return list;
}
private void traverse(TreeNode root, List<Integer> list, int level) {
if (root == null) {
return;
}
if (list.size() == level) {
list.add(root.val);
}
traverse(root.right, list, level + 1);
traverse(root.left, list, level + 1);
}
}