按之字形順序列印二叉樹

2021-07-22 13:00:59 字數 2407 閱讀 9105

其實我們可以借鑑層次遍歷時候的思路, 參見劍指offer–060-把二叉樹列印成多行, 我們把層次遍歷的結果儲存在vector< vector >中每一層儲存在乙個vector中, 那麼我們輸出的時候就可以進行調整, 按照之字形輸出即可

for(int i = 0; i if(i & 1)

}return ans;

完整**如下, 其中levelorder可以被替換成其他的層次遍歷的方法, 這裡我們就不詳細講了

#include 

#include

#include

using

namespace

std;

#define __tmain main

#ifdef __tmain

#define debug cout

#else

#define debug 0 && cout

#endif // __tmain

#define undebug 0 && cout

#ifdef __tmain

struct treenode

};#endif // __tmain

class solution

if(ans.size( ) == p)

ans[p].push_back(proot->val);

levelorder(proot->left, p + 1);

levelorder(proot->right, p + 1);

}vector

< vector

> print(treenode* proot)

}return ans;

}};int __tmain( )

上面那種方法是在層次遍歷完成後的輸出過程進行轉換,這種處理對於海量資料就很雞肋了

當然我們也可以在層次遍歷的過程中就行轉換,在層次遍歷遍歷的過程中, 將元素的輸出順序即插入順序與其層數相關聯

我們之前提到過, 層次遍歷右多種方法, 我們可以在

對二叉樹進行層次遍歷, 設定乙個標識層數或者遍歷順序

處理每層的元素的時候, 按照遍歷順序進行從前往後遍歷或者從後往前遍歷

那麼為了更好的處理, 我們其實可以有很多種方法, 由於要雙向遍歷, 那麼我們就用雙端佇列deque儲存最為方便

關於層次遍歷的方法我們這裡不再詳述, 我們這裡採用的方式是在每層的結束插入乙個特殊標識(null), 來表示一層的結束

當然可以有其他方法, 但是基本思路相同, 而且層次遍歷只是本題的一部分, 關鍵是如何實現之字訪問

class solution

vector

curr;

deque

deq;

deq.push_back(null);//層分隔符

deq.push_back(proot);

bool lefttoright = true;

while (deq.size( ) != 1)

}else

// 從後往前遍歷

}lefttoright = !lefttoright;

ret.push_back(curr);

curr.clear();

deq.push_back(null);//新增層分隔符

continue;//一定要continue

}if (node->left != null)

if (node->right != null)

}return ret;

}};

也可以用兩個棧來儲存節點的每一層,

class solution

vector

curr;

stack

levels[2];

#define left_to_right 1 // 先左後右訪問, 意味著先右後左入棧

#define right_to_left 0 // 先右後左訪問, 意味著先左後右入棧

int current = left_to_right;

int next = right_to_left;

levels[current].push(proot);

while(levels[left_to_right].empty( ) != true

|| levels[right_to_left].empty( ) != true)

if(pnode->right != null)

}else

// 先右後左入棧

if(pnode->left != null)

}if(levels[current].empty( ) == true)

}return res;

}};

按之字形順序列印二叉樹

題目描述 按之字形順序列印二叉樹 請實現乙個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。解析 要分層列印,不能用常規方法,訪問乙個節點後,將該節點的左右子節點壓入佇列。奇數層從左到右列印,偶數層從右向左列印。使...

按之字形順序列印二叉樹

請實現乙個函式按照之字形順序列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右到左的順序列印,第三行再按照從左到右的順序列印,其他行以此類推。include iostream include stack using namespace std struct treenode void pri...

按之字形順序列印二叉樹

請實現乙個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。以題目中的二叉樹為例,一步步分析。當二叉樹的根結點 結點1 列印之後,它的左子結點 結點2 和右子結點 結點3 先後儲存到乙個容器中。值得注意的是,在列印第...