用兩個queue來進行打印,一個隊列表示當前正在打印的隊列,另一個隊列記錄正在打印的隊列中節點的子節點,若當前打印的隊列爲空,打印下一層。
/**
*Copyright @ 2019 Zhang Peng. All Right Reserved.
*Filename:
*Author: Zhang Peng
*Date:
*Version:
*Description:
**/
#include<iostream>
#include<stack>
#include<string>
#include<queue>
using namespace std;
struct TreeNode
{
char val;
TreeNode * left;
TreeNode * right;
TreeNode(char x) :val(x), left(nullptr), right(nullptr){};
};
void CreatTree(TreeNode * & tree, string str, int & index)
{
//前序遍歷字符串建立樹
if (index < str.size())
{
if (str[index] != '#')
{
tree = new TreeNode(str[index]);
index++;
CreatTree(tree->left, str, index);
CreatTree(tree->right, str, index);
}
else
{
tree = nullptr;
index++;
return;
}
}
}
void PrintTree(TreeNode * root)
{
if (root == nullptr)
return;
queue<TreeNode *> toprint,next;
toprint.push(root);
while (!toprint.empty())
{
TreeNode * pnode = toprint.front();
toprint.pop();
cout << pnode->val << " ";
if (pnode->left)
next.push(pnode->left);
if (pnode->right)
next.push(pnode->right);
if (toprint.empty())
{
toprint = next;
next=queue<TreeNode *>();
cout << endl;
}
}
}
int main()
{
string str = "abdg####ce##f##"; //用#表示nullptr
TreeNode * tree;
int start = 0;
CreatTree(tree, str, start);
PrintTree(tree);
system("pause");
return 0;
}
如果按之字形打印二叉樹,可將每一層要打印的元素存進vector,再根據奇數還是偶數次打印選擇從前往後還是從後往前的順序。
void PrintTree2(TreeNode * root)
{
if (root == nullptr)
return;
queue<TreeNode *> toprint, next;
toprint.push(root);
vector<char> v;
int num = 0;
while (!toprint.empty())
{
TreeNode * pnode = toprint.front();
toprint.pop();
v.push_back(pnode->val);
if (pnode->left)
next.push(pnode->left);
if (pnode->right)
next.push(pnode->right);
if (toprint.empty())
{
if ((num & 1) == 0)
{
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
cout << endl;
}
else
{
for (int i = v.size()-1; i>=0; i--)
cout << v[i] << " ";
cout << endl;
}
v.clear();
toprint = next;
next = queue<TreeNode *>();
num++;
}
}
}