#include<iostream>
#include<deque>
using namespace std;
struct BinaryTreeNode
{
int m_dbValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
//创建树节点
BinaryTreeNode* CreateBinaryTreeNode(double dbValue)
{
BinaryTreeNode* pNode = new BinaryTreeNode();
pNode->m_dbValue = dbValue;
pNode->m_pLeft = nullptr;
pNode->m_pRight = nullptr;
return pNode;
}
//连接结点
void ConnectTreeNodes(BinaryTreeNode* pParent, BinaryTreeNode* pLeft, BinaryTreeNode* pRight)
{
if (pParent != nullptr)
{
pParent->m_pLeft = pLeft;
pParent->m_pRight = pRight;
}
}
//释放内存
void DestroyTree(BinaryTreeNode* pRoot)
{
if (pRoot != nullptr)
{
BinaryTreeNode* pLeft = pRoot->m_pLeft;
BinaryTreeNode* pRight = pRoot->m_pRight;
delete pRoot;
pRoot = nullptr;
DestroyTree(pLeft);
DestroyTree(pRight);
}
}
//分行从上到下打印
void Print(BinaryTreeNode* pRoot)
{
if (pRoot == nullptr)
return;
//toBePrinted保存当前行的打印数,nextLevel保存下一行的打印数
int toBePrinted = 1;
int nextLevel = 0;
//创建一个队列,队列首元素是当前要打印的元素
deque<BinaryTreeNode*> dequeTreeNode;
dequeTreeNode.push_back(pRoot);
//当队列不为空时,循环继续
while (dequeTreeNode.size())
{
//打印队列首元素,同时把左结点和右结点按顺序压入队列中,同时++nextLevel
BinaryTreeNode* pNode = dequeTreeNode.front();
printf("%d ", pNode->m_dbValue);
if (pNode->m_pLeft!=nullptr)
{
dequeTreeNode.push_back(pNode->m_pLeft);
++nextLevel;
}
if (pNode->m_pRight != nullptr)
{
dequeTreeNode.push_back(pNode->m_pRight);
++nextLevel;
}
dequeTreeNode.pop_front();
--toBePrinted;
//当toBePrint为0时表示当前行已全部打印完,打印换行符并把nextLevel赋值给toBePrinted
if (toBePrinted == 0)
{
printf("\n");
toBePrinted = nextLevel;
nextLevel = 0;
}
}
}
int main()
{
BinaryTreeNode* pNode10 = CreateBinaryTreeNode(10);
BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
BinaryTreeNode* pNode14 = CreateBinaryTreeNode(14);
BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);
BinaryTreeNode* pNode12 = CreateBinaryTreeNode(12);
BinaryTreeNode* pNode16 = CreateBinaryTreeNode(16);
ConnectTreeNodes(pNode10, pNode6, pNode14);
ConnectTreeNodes(pNode6, pNode4, pNode8);
ConnectTreeNodes(pNode14, pNode12, pNode16);
Print(pNode10);
DestroyTree(pNode10);
return 0;
}
分行从上到下打印二叉树
猜你喜欢
转载自blog.csdn.net/weixin_39916039/article/details/82596888
今日推荐
周排行