按之字形順序列印二叉樹

2021-08-05 18:17:57 字數 1222 閱讀 7746

請實現乙個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。

以題目中的二叉樹為例,一步步分析。

當二叉樹的根結點(結點1)列印之後,它的左子結點(結點2)和右子結點(結點3)先後儲存到乙個容器中。值得注意的是,在列印第二層的結點時,先列印結點3,後列印結點2。由此可見結點在這個容器中是後進先出的,因此該容器可以用棧來實現。

接著列印第二層的兩個節點。根據題目定義,先列印結點3,再列印結點2,並把他們的子結點放入乙個容器中。注意到,列印第三層時,先列印結點2的兩個結點,後列印結點3的兩個結點。這意味著,我們還可以用乙個棧來儲存結點2和結點3的子結點。

此外我們還注意到,第三層的結點是從左向右列印的。按照棧後進先出的特點,應該先儲存7到棧中,再儲存結點6,之後再分別儲存結點5和結點4。也就是說,在列印第二層的時候,我們先儲存右子結點到棧中,再儲存左子結點到棧中。儲存子結點的順序和列印第一層時不一樣。

接下來列印第三層。與之前一樣,在列印第三層的同時,我們要把第四層的結點儲存到乙個棧中。由於第四層的列印順序是從右到左,因此儲存的順序是從左到右。這和儲存根結點的兩個子結點的順序是一樣的。

從上面的分析可以看出,按之字形順序列印二叉樹,需要兩個棧。當我們在列印某一行的結點時,把下一層的結點儲存到相應的棧中。如果當前列印的是奇數層,則先儲存左子結點再儲存右子結點到乙個棧中;如果當前列印的是偶數層,則先儲存右子結點再儲存左子結點到另乙個棧中。 

/*

struct treenode

};*/

class solution

stacks1;

stacks2;

s1.push(proot);

treenode*temp;

vectortp;

while(!s1.empty()||!s2.empty())

res.push_back(tp);

tp.clear();

}else

res.push_back(tp);

tp.clear();}}

return res;}};

按之字形順序列印二叉樹

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

按之字形順序列印二叉樹

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

按之字形順序列印二叉樹

其實我們可以借鑑層次遍歷時候的思路,參見劍指offer 060 把二叉樹列印成多行,我們把層次遍歷的結果儲存在vector vector 中每一層儲存在乙個vector中,那麼我們輸出的時候就可以進行調整,按照之字形輸出即可 for int i 0 i if i 1 return ans 完整 如下...