编程算法 - 二进制阵列配置和打印
2015-06-07 10:03
176 查看
数组构造二叉树并打印
本文地址: http://blog.csdn.net/caroline_wendy数组:
构造二叉树, 需要使用两个队列(queue), 保存子节点和父节点, 并进行交换;
打印二叉树, 需要使用两个队列(queue), 依次打印父节点和子节点, 并进行交换;
二叉树的数据结构:
struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pParent; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; };
代码:
/*
* main.cpp
*
* Created on: 2014.6.12
* Author: Spike
*/
/*eclipse cdt, gcc 4.8.1*/
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pParent; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; };
void printTree (BinaryTreeNode* tree)
{
BinaryTreeNode* node = tree;
std::queue<BinaryTreeNode*> temp1;
std::queue<BinaryTreeNode*> temp2;
temp1.push(node);
while (!temp1.empty())
{
node = temp1.front();
if (node->m_pLeft != NULL) {
temp2.push(node->m_pLeft);
}
if (node->m_pRight != NULL) {
temp2.push(node->m_pRight);
}
temp1.pop();
std::cout << node->m_nValue << " ";
if (temp1.empty())
{
std::cout << std::endl;
temp1 = temp2;
std::queue<BinaryTreeNode*> empty;
std::swap(temp2, empty);
}
}
}
BinaryTreeNode* buildTree (const std::vector<int>& L)
{
if (L.empty()) return nullptr;
std::queue<BinaryTreeNode*> parentQueue;
std::queue<BinaryTreeNode*> childQueue;
BinaryTreeNode* root = new BinaryTreeNode();
root->m_nValue = L[0];
parentQueue.push(root);
std::size_t times = 1;
while (times < L.size())
{
BinaryTreeNode* parent = parentQueue.front();
parentQueue.pop();
BinaryTreeNode* lchild = new BinaryTreeNode();
lchild->m_nValue = L[times];
lchild->m_pLeft = nullptr;
lchild->m_pRight = nullptr;
++times;
parent->m_pLeft = lchild;
lchild->m_pParent = parent;
childQueue.push(lchild);
if (times == L.size()) break;
BinaryTreeNode* rchild = new BinaryTreeNode();
rchild->m_nValue = L[times];
rchild->m_pLeft = nullptr;
rchild->m_pRight = nullptr;
++times;
parent->m_pRight = rchild;
rchild->m_pParent = parent;
childQueue.push(rchild);
if (parentQueue.empty()) {
parentQueue = childQueue;
std::queue<BinaryTreeNode*> empty;
std::swap(childQueue, empty);
}
}
return root;
}
int main (void)
{
std::vector<int> L = {49, 38, 65, 97, 76, 13, 27, 49};
BinaryTreeNode* tree = buildTree(L);
printTree(tree);
return 0;
}
输出:
49 38 65 97 76 13 27 49
不包含父节点的树:
/* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #include <stack> #include <queue> using namespace std; struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; void printTree (BinaryTreeNode* tree) { BinaryTreeNode* node = tree; std::queue<BinaryTreeNode*> temp1; std::queue<BinaryTreeNode*> temp2; temp1.push(node); while (!temp1.empty()) { node = temp1.front(); if (node->m_pLeft != NULL) { temp2.push(node->m_pLeft); } if (node->m_pRight != NULL) { temp2.push(node->m_pRight); } temp1.pop(); std::cout << node->m_nValue << " "; if (temp1.empty()) { std::cout << std::endl; temp1 = temp2; std::queue<BinaryTreeNode*> empty; std::swap(temp2, empty); } } } BinaryTreeNode* buildTree (const std::vector<int>& L) { if (L.empty()) return nullptr; std::queue<BinaryTreeNode*> parentQueue; std::queue<BinaryTreeNode*> childQueue; BinaryTreeNode* root = new BinaryTreeNode(); root->m_nValue = L[0]; parentQueue.push(root); std::size_t times = 1; while (times < L.size()) { BinaryTreeNode* parent = parentQueue.front(); parentQueue.pop(); BinaryTreeNode* lchild = new BinaryTreeNode(); lchild->m_nValue = L[times]; lchild->m_pLeft = nullptr; lchild->m_pRight = nullptr; ++times; parent->m_pLeft = lchild; childQueue.push(lchild); if (times == L.size()) break; BinaryTreeNode* rchild = new BinaryTreeNode(); rchild->m_nValue = L[times]; rchild->m_pLeft = nullptr; rchild->m_pRight = nullptr; ++times; parent->m_pRight = rchild; childQueue.push(rchild); if (parentQueue.empty()) { parentQueue = childQueue; std::queue<BinaryTreeNode*> empty; std::swap(childQueue, empty); } } return root; } int main (void) { std::vector<int> L = {49, 38, 65, 97, 76, 13, 27, 49}; BinaryTreeNode* tree = buildTree(L); printTree(tree); return 0; }
输出:
49 38 65 97 76 13 27 49
相关文章推荐
- Bitmap类getPixels()方法中参数stride理解
- Spring包下载地址
- 浅谈 ngx_lua 在 UPYUN 的应用
- C#设计模式(20)——策略者模式(Stragety Pattern)
- memcpy源代码
- c++虚函数表
- c++虚函数表
- SpringMVC访问静态资源的三种方式
- MFC+opencv+win32界面编程
- NYOJ 49 开心的小明(01背包问题)
- javabean总结
- JAVA序列化机制的深入研究
- NYOJ 47 过河问题
- wamp 中安装cakephp Fatal error: You must enable the intl extension to use CakePHP. in XXX
- ASP.NET中集成百度编辑器UEditor
- C++模板中的静态
- python 2 给我自己看
- java获得平台相关的行分隔符和java路径分隔符的方法
- 一起talk C栗子吧(第十一回:C语言实例--文件组织结构)
- QeePHP View视图的默认变量与新增变量