請實現乙個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。
以題目中的二叉樹為例,一步步分析。
當二叉樹的根結點(結點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 完整 如下...