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

编程算法 - 二进制阵列配置和打印

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: