《劍指offer》:[61]按之字形順序列印二叉樹
題目:請實現一個函式按照之字形順序列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右到左的順序列印,第三層再按照從左到右列印,其他行以此類推。
例如:按之字形順序列印二叉樹的結果如下圖:
列印結果:
1
3,2
4,5,6,7
15,14,13,12,11,10,9,8
方案:利用兩個棧。時間複雜度O(N)+輔助空間2*O(N)。具體方法:我們在列印某一結點時,把下一層的子結點儲存到相應的棧裡。如果當前列印的是奇數層(例如第一層,第三層...第2*n+1層),則先儲存左子結點再儲存右子結點到棧裡;如果當前列印的是偶數層(2*n),則先儲存右子結點再儲存左子結點。具體分析步驟如下:
#include <iostream>
#include <stack>
using namespace std;
struct BinaryTree
{
int data;
BinaryTree *pLeft;
BinaryTree *pRight;
};
BinaryTree *pRoot=NULL;
void CreateTree(BinaryTree *&root)
{
int data;
cin>>data;
if(0==data)
root=NULL;
else
{
root =new BinaryTree;
root->data=data;
CreateTree(root->pLeft);
CreateTree(root->pRight);
}
}
void PrintZhi(BinaryTree *root)
{
if(NULL==root)
return;
stack<BinaryTree*> level[2];
int current=0;
int next=1;
level[current].push(root);
while(!level[0].empty() || !level[1].empty())
{
BinaryTree *node=level[current].top();
level[current].pop();
cout<<node->data<<" ";
if(current==0)
{
if(node->pLeft!=NULL)//從左端開始入棧;
level[next].push(node->pLeft);
if(node->pRight!=NULL)
level[next].push(node->pRight);
}
else
{
if(node->pRight!=NULL)
level[next].push(node->pRight);
if(node->pLeft!=NULL)
level[next].push(node->pLeft);
}
if(level[current].empty())
{
cout<<endl;
current=1-current;
next=1-next;
}
}
}
void PreOrder(BinaryTree *root)
{
if(root)
{
cout<<root->data<<" ";
PreOrder(root->pLeft);
PreOrder(root->pRight);
}
}
int main()
{
CreateTree(pRoot);
cout<<"前序遍歷:";
PreOrder(pRoot);
cout<<endl;
cout<<"之字形列印結果如下:"<<endl;
PrintZhi(pRoot);
system("pause");
return 0;
}
執行結果:
相關文章
- JZ-059-按之字形順序列印二叉樹二叉樹
- [劍指offer] 把二叉樹列印成多行二叉樹
- 《劍指offer》:[60]把二叉樹列印成多行二叉樹
- 【劍指offer】從上向下列印二叉樹二叉樹
- 演算法題(三十七):按之字形順序列印二叉樹演算法二叉樹
- 【劍指offer】5.二叉樹的映象和列印二叉樹
- 劍指offer(C++)——把二叉樹列印成多行C++二叉樹
- 劍指offer——重建二叉樹二叉樹
- 【劍指offer】二叉樹深度二叉樹
- 劍指offer--把二叉樹列印成多行(C++)二叉樹C++
- 劍指offer——從上往下列印二叉樹C++二叉樹C++
- 劍指offer之順序列印陣列陣列
- 【劍指offer】順時針列印矩陣矩陣
- 【劍指offer】調整陣列順序陣列
- 劍指offer(四)重建二叉樹二叉樹
- 劍指 Offer 32 - III. 從上到下列印二叉樹 III二叉樹
- LeetCode 劍指offer——從上到下列印二叉樹 II、從上到下列印二叉樹 IIILeetCode二叉樹
- 劍指 Offer 07. 重建二叉樹二叉樹
- 【劍指offer】判斷二叉樹平衡二叉樹
- 劍指offer-19:順時針列印矩陣矩陣
- 劍指 Offer 32 - I. 從上到下列印二叉樹(java解題)二叉樹Java
- 劍指Offer-40-二叉樹的深度二叉樹
- 劍指offer——二叉樹的映象C++二叉樹C++
- 【劍指offer】27. 二叉樹的映象二叉樹
- 劍指offer——二叉樹的深度C++二叉樹C++
- 《劍指offer》:[59]對稱的二叉樹二叉樹
- 《劍指offer》:[39]求解二叉樹的深度二叉樹
- 《劍指offer》:[62]序列化二叉樹二叉樹
- 劍指offer面試題29:順時針列印矩陣面試題矩陣
- 【劍指offer】【4】根據前序和中序結果,重建二叉樹二叉樹
- 劍指offer | 55 - I. 二叉樹的深度二叉樹
- 劍指 Offer 29-順時針列印矩陣c++矩陣C++
- 力扣 - 劍指 Offer 29. 順時針列印矩陣力扣矩陣
- 劍指 Offer 32 - II. 從上到下列印二叉樹 II 做題筆記二叉樹筆記
- 劍指offer刷題筆記-32.從上到下列印二叉樹 進階筆記二叉樹
- 力扣 - 劍指 Offer 27. 二叉樹的映象力扣二叉樹
- # 劍指 Offer 68 - II. 二叉樹的最近公共祖先二叉樹
- 《劍指offer》之在完全二叉樹中新增子節點二叉樹