您的位置:首页 > 编程语言 > C语言/C++

C++编程,输出二叉树每层最右端节点的数值

2016-02-24 14:30 453 查看
例如,对于如下二叉树,应输出8,7,5,4,2。



很明显的思路是按层遍历,关键在于如何标记最右端节点。按层遍历常见的写法是将节点放入队列,出列后再将其子节点放入队列,实质上是一层一层放入队列,并且队列中最多只能有相邻的两层节点。那么我们可以用两个队列来存储,将上层节点放入队列一,出队后将其子节点(即下层节点)放入队列二,两个队列交替进行。代码如下:

#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) {
queue<TreeNode*> q1, q2;
TreeNode *tmp;
if (root == NULL) {
return;
}
q1.push(root);
//只要两队列都不为空
while (!(q1.empty() && q2.empty())) {
while (!q1.empty()) {
tmp = q1.front();
q1.pop();
if (tmp->left != NULL) {
q2.push(tmp->left);
}
if (tmp->right != NULL) {
q2.push(tmp->right);
}
if (q1.empty()) {
cout << tmp->val << endl;
}
}
while (!q2.empty()) {
tmp = q2.front();
q2.pop();
if (tmp->left != NULL) {
q1.push(tmp->left);
}
if (tmp->right != NULL) {
q1.push(tmp->right);
}
if (q2.empty()) {
cout << tmp->val << endl;
}
}
}
}

void main() {
string s = "{8,9,7,#,#,6,5,3,#,4,#,#,2}";
TreeNode *root = StringToBinaryTree(s);
printRightNode(root);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: