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); }
相关文章推荐
- C++控制台程序实现暂停功能
- C/C++——求下面数据类型的最大值和最小值: char, short, int, long, float, double, long double和numeric_limits使用
- new (std::nothrow) 与 new
- 2、C++ 的升级
- C语言多线程同步 -- 信号量semaphore.h
- c++ 显示小数点后的0
- C++命名空间的使用实践
- [C++]隐式类类型转换(转)
- C++设计模式-1简单工厂模式
- c语言入门之项目3.9——输出一个“空”三角形
- c++STL中常用模板常用函数记录(新手向)
- C/C++——基本数据类型的大小并且sizeof(int *) = 8
- C语言日志的实现,用宏实现日志
- 程序员面试题精选100题(56)-C/C++/C#面试题(4)
- 程序员面试题精选100题(54)-C++/C#面试题(3)
- 程序员面试题精选100题(53)-C++/C#面试题(2)
- 程序员面试题精选100题(52)-C++面试题(1)
- C语言深度剖析-----函数与指针的分析
- 程序员面试题精选100题(45)-Singleton(C/C++/C#)
- Jni——java调用C++