树(3)树的层次遍历
2016-07-16 09:27
330 查看
问题描述:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
例如输入
8
/ /
6 10
/ / / /
5 7 9 11
输出8 6 10 5 7 9 11。
代码如下:
运行结果如下:(centos5.5)
[root@localhost c++]# ./a.out
8 6 5 -1 -1 7 -1 -1 10 9 -1 -1 11 -1 -1
8 6 5 7 10 9 11
8 6 10 5 7 9 11
起初写代码,忘记取队首元素,出现了死循环
例如输入
8
/ /
6 10
/ / / /
5 7 9 11
输出8 6 10 5 7 9 11。
代码如下:
#include<iostream> #include<queue> using namespace std; struct bstNode { bstNode *pLeft; bstNode *pRight; int value; }; void createTree(bstNode *&pRoot) { bstNode *root = pRoot; int val; cin >> val; if (val == -1) root = NULL; else { pRoot = (bstNode *)malloc(sizeof(pRoot)); pRoot->value = val; createTree(pRoot->pLeft); createTree(pRoot->pRight); } } void destroy(bstNode *&pRoot) { if (pRoot != NULL) { destroy(pRoot->pLeft); destroy(pRoot->pRight); free(pRoot); } } int preOrder(bstNode *pRoot) { if (pRoot != NULL) { cout << pRoot->value << " "; preOrder(pRoot->pLeft); preOrder(pRoot->pRight); } } void levelOrder(bstNode *pRoot) { if (pRoot == NULL) return ; queue<bstNode *> que; que.push(pRoot); bstNode *root; while (!que.empty()) { root = que.front();//取队首元素,这样后面才能逐层进行下去 cout << root->value<<" "; que.pop();//必须出队列 if (root->pLeft != NULL) que.push(root->pLeft); if (root->pLeft != NULL) que.push(root->pRight); } } int main() { bstNode *p = NULL; createTree(p); preOrder(p); cout << endl; levelOrder(p); cout << endl; destroy(p); return 0; }
运行结果如下:(centos5.5)
[root@localhost c++]# ./a.out
8 6 5 -1 -1 7 -1 -1 10 9 -1 -1 11 -1 -1
8 6 5 7 10 9 11
8 6 10 5 7 9 11
起初写代码,忘记取队首元素,出现了死循环
相关文章推荐
- 文件遍历排序函数
- Lua 学习笔记之C API 遍历 Table实现代码
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#中遍历Hashtable的4种方法
- Erlang中遍历取出某个位置的最大值代码
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- C++实现图的邻接表存储和广度优先遍历实例分析
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
- C++非递归队列实现二叉树的广度优先遍历
- php遍历目录方法小结
- 一个目录遍历函数
- php遍历删除整个目录及文件的方法
- PHP遍历文件夹与文件类及处理类用法实例
- PHP遍历XML文档所有节点的方法
- php中使用key,value,current,next和prev函数遍历数组的方法
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- C#使用foreach遍历哈希表(hashtable)的方法
- php递归遍历多维数组的方法
- WinForm遍历窗体所有子控件的方法
- C#集合遍历时删除和增加元素的方法