Given a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered from top to bottom.
For example:
Given the following binary tree,
1 <--- / \ 2 3 <--- \ \ 5 4 <---
You should return [1, 3, 4]
.
1、BFS(记录每层节点个数)
vector<int> rightSideView(TreeNode *root) {
if(root==nullptr) return{};
int curLevelNodeNum=1;
int nextLevelNodeSum=0;
queue<TreeNode*> queueData;
queueData.push(root);
TreeNode* curNode;
vector<int> result;
while(curLevelNodeNum)//!queueData.empty()
{
curNode=queueData.front();
curLevelNodeNum--;
if(curNode->left)
{
nextLevelNodeSum++;
queueData.push(curNode->left);
}
if(curNode->right)
{
nextLevelNodeSum++;
queueData.push(curNode->right);
}
if(curLevelNodeNum==0)
{
curLevelNodeNum=nextLevelNodeSum;
nextLevelNodeSum=0;
result.push_back(curNode->val);
}
queueData.pop();
}
return result;
}
2、BFS(使用两个队列)
vector<int> rightSideView(TreeNode *root) {
if(root==nullptr) return{};
queue<TreeNode*> curLevelNode;
queue<TreeNode*> nextLevelNode;
curLevelNode.push(root);
TreeNode* curNode;
vector<int> result;
while(!curLevelNode.empty())
{
curNode=curLevelNode.front();
curLevelNode.pop();
if(curNode->left)
{
nextLevelNode.push(curNode->left);
}
if(curNode->right)
{
nextLevelNode.push(curNode->right);
}
if(curLevelNode.empty())
{
queue<TreeNode*> temp;
curLevelNode=nextLevelNode;
nextLevelNode=temp;
result.push_back(curNode->val);
}
}
return result;
}
3、BFS(使用两个队列,由于copy赋值代价较大,通过指针赋值)
vector<int> rightSideView(TreeNode *root) {
if(root==nullptr) return{};
queue<TreeNode*> curLevelNode;
queue<TreeNode*> nextLevelNode;
queue<TreeNode*> *pCurLevelNode=&curLevelNode;
queue<TreeNode*> *pNextLevelNode=&nextLevelNode;
pCurLevelNode->push(root);
TreeNode* curNode;
vector<int> result;
while(!pCurLevelNode->empty())
{
curNode=pCurLevelNode->front();
pCurLevelNode->pop();
if(curNode->left)
{
pNextLevelNode->push(curNode->left);
}
if(curNode->right)
{
pNextLevelNode->push(curNode->right);
}
if(pCurLevelNode->empty())
{
queue<TreeNode*> *temp=pCurLevelNode;
pCurLevelNode=pNextLevelNode;
pNextLevelNode=temp;
result.push_back(curNode->val);
}
}
return result;
}
4、先序遍历-递归(若该层右侧有非空节点,则覆盖其左侧赋予该层的值)
vector<int> rightSideView(TreeNode *root) {
if(root==nullptr) return {};
vector<int> result;
int level=0;
preOrderTravel(root,result,level);
return result;
}
void preOrderTravel(TreeNode* root,vector<int> &result,int level)
{
if(root==nullptr) return;
if(result.size()<(level+1))
result.push_back(root->val);
else
result.at(level)=root->val;
preOrderTravel(root->left,result,level+1);
preOrderTravel(root->right,result,level+1);
}