例如,对于如下二叉树,应输出8,7,5,4,2。
很明显的思路是按层遍历,关键在于如何标记最右端节点。按层遍历常见的写法是将节点放入队列,出列后再将其子节点放入队列,实质上是一层一层放入队列,并且队列中最多只能有相邻的两层节点。那么我们可以用两个队列来存储,将上层节点放入队列一,出队后将其子节点(即下层节点)放入队列二,两个队列交替进行。代码如下:
#include<stdlib.h>
#include<iostream>
#include<queue>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
int getOneNodeVal(string &str,int &curPos){
int rootVal=0;
int nextPos=curPos;
string valStr;
//生成根节点
nextPos=str.find_first_of(',',curPos);
if (nextPos!=string::npos){
valStr = str.substr(curPos,nextPos-curPos);
}
else{
valStr = str.substr(curPos,str.size()-1-curPos);
}
rootVal = atoi(valStr.c_str());
curPos=nextPos;
return rootVal;
}
TreeNode *StringToBinaryTree(string str){
//空树返回NULL
if (str.compare("{}")==0){
return NULL;
}
//生成根节点
int rootVal=0;
int curPos=1;
rootVal = getOneNodeVal(str,curPos);
TreeNode *root = new TreeNode(rootVal);
//初始化广度优先队列
vector <TreeNode *> preLevel,curLevel;
preLevel.push_back(root);
//遍历字符串生成二叉树
int levelNodeNum=2;
int alreadyGenerate=0;
TreeNode *pTemp=NULL;
while(true){
//证明所有节点都生成完毕了
if (curPos==string::npos){
break;
}
curPos++;
if (str[curPos]=='#'){
curPos++;pTemp=NULL;
}
else{
rootVal = getOneNodeVal(str,curPos);
TreeNode *pTemp = new TreeNode(rootVal);
//left child
if (alreadyGenerate%2==0){
preLevel[alreadyGenerate/2]->left=pTemp;
}
//right child
else{
preLevel[alreadyGenerate/2]->right=pTemp;
}
curLevel.push_back(pTemp);
}
alreadyGenerate ++;
if (alreadyGenerate==levelNodeNum)
{
alreadyGenerate=0;
preLevel.swap(curLevel);
curLevel.clear();
levelNodeNum=preLevel.size()*2;
}
}
return root;
}
void printRightNode(TreeNode *root) {
if (root == NULL) {
return;
}
vector<int> res;
queue<TreeNode*> q;
q.push(root);
while (!q.empty())
{
res.push_back(q.back()->val);
queue<TreeNode*> tmp;
while (!q.empty())
{
TreeNode *n = q.front();
if (n->left != NULL)
{
tmp.push(n->left);
}
if (n->right != NULL)
{
tmp.push(n->right);
}
q.pop();
}
q = tmp;
}
for (vector<int> ::iterator iter = res.begin(); iter != res.end(); iter++)
{
cout << *iter << endl;
}
}
int main() {
string s = "{8,9,7,#,#,6,5,3,#,4,#,#,2}";
TreeNode *root = StringToBinaryTree(s);
printRightNode(root);
return 0;
}