题目描述
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
C++
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
/*
递归停止条件:节点为空
返回什么: 右边可以看到的节点值
本级递归干什么: 首先根节点一定能看到,左右子树递归,右子树返回的列表都能看见,对于左子树比右子树高,需要把左子树多的元素也加进来
*/
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
vector<int> res;
if(root == nullptr) return res;
res.push_back(root->val);
vector<int> templ; //左子树返回的
vector<int> tempr;
templ=rightSideView(root->left);
tempr=rightSideView(root->right);
res.insert(res.end(),tempr.begin(),tempr.end());
if(templ.size()>tempr.size()){
for(int i=tempr.size();i<templ.size();i++){
res.push_back(templ[i]);
}
}
return res;
}
};
以上是我的解法,但是时间和空间复杂度太高了
参考其他人
根结点 -> 右子树 -> 左子树」 的顺序访问, 就可以保证每层都是最先访问最右边的节点的。
(与先序遍历 「根结点 -> 左子树 -> 右子树」 正好相反,先序遍历每层最先访问的是最左边的节点)
class Solution {
List<Integer> res = new ArrayList<>();
public List<Integer> rightSideView(TreeNode root) {
dfs(root, 0); // 从根节点开始访问,根节点深度是0
return res;
}
private void dfs(TreeNode root, int depth) {
if (root == null) {
return;
}
// 先访问 当前节点,再递归地访问 右子树 和 左子树。
if (depth == res.size()) { // 如果当前节点所在深度还没有出现在res里,说明在该深度下当前节点是第一个被访问的节点,因此将当前节点加入res中。
res.add(root.val);
}
depth++;
dfs(root.right, depth);
dfs(root.left, depth);
}
}