主要思路
方法一:深搜
维护一个map映射,key为树的高度,value为对应层数(高度)的最右值。在维护一个结点栈和深度栈,这两个栈也是一一对应的关系,结点与他的高度。
算法主要流程就是从根节点开始搜索,每次优先访问右子树,那么这一层的最右节点就是它。若没有右子树则访问左子树,对左子树在执行上述操作。用栈模拟该过程即可,先将左子树入栈,再将右子树入栈,然后栈顶元素出栈,优先处理的就是右子树。
方法二:广搜
对二叉树进行层次遍历,从左到右,每层最后遍历的即为最右边结点,用队列实现,不断更新每一层最右结点。
using namespace std;
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> vec;
if(root==nullptr)return vec;
unordered_map<int,int> dep_rightval_map;
int max_depth = 0;//树的深度
stack<TreeNode *> nodeStk;
stack<int> depthStk;
nodeStk.push(root);
depthStk.push(1);
while(!depthStk.empty()) {
TreeNode *node = nodeStk.top();nodeStk.pop();
int depth = depthStk.top();depthStk.pop();
if(node!=nullptr) {
max_depth = max(depth,max_depth);
if(dep_rightval_map.find(depth)==dep_rightval_map.end()) {//该高度还没有最右值,则插入
dep_rightval_map[depth] = node->val;
}
nodeStk.push(node->left);
nodeStk.push(node->right);
depthStk.push(depth+1);
depthStk.push(depth+1);
}
}
for(int i = 1;i<=max_depth;i++) {
vec.push_back(dep_rightval_map[i]);
}
return vec;
}
};
//广度优先搜索
class Solution {
public:
vector<int> rightSideView(TreeNode *root) {
vector<int> vec;
if(root==nullptr)return vec;
unordered_map<int,int> dep_rightval_map;
int max_depth = 0;//树的深度
queue<TreeNode *> node_que;
queue<int> depth_que;
node_que.push(root);
depth_que.push(1);
while(!node_que.empty()) {
TreeNode *node = node_que.front();node_que.pop();
int depth = depth_que.front();depth_que.pop();
if(node!=nullptr) {
max_depth = max(depth,max_depth);
//不需要判断,因为是层次遍历,每一层最后一个结点,不断更新即可
dep_rightval_map[depth] = node->val;
node_que.push(node->left);
node_que.push(node->right);
depth_que.push(depth+1);
depth_que.push(depth+1);
}
}
for(int i = 1;i<=max_depth;i++) {
vec.push_back(dep_rightval_map[i]);
}
return vec;
}
};