劍指Offer 按之字形順序列印二叉樹

2021-08-19 17:04:01 字數 1508 閱讀 5464

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

方法和從上往下列印二叉樹類似,遍歷順序是從上到下,每一行按照從左到右的順序進行遍歷,但是需要增加乙個引數row來標記當前行數,如果是偶數行,則每次將值放入vector的末尾;如果是奇數行,則每次將值插入vector的第乙個位置。

/*

struct treenode

};*/

class solution

if( row%2 == 0 )

res[row].push_back( node->val );

else

res[row].insert(res[row].begin(), node->val);

q.push( make_pair(node->left, row+1) );

q.push( make_pair(node->right, row+1) );

}return res;

}};

根據題意,每行的節點的訪問順序是相反的,我們可以用兩個棧來隔行儲存,乙個棧中根據「左結點->右結點」的順序訪問另乙個棧的棧頂元素,而另乙個棧根據「右子樹->左子樹」的順序訪問另乙個棧的棧頂元素,直到兩個棧都為空

以如下二叉樹為例:

1

82 /\36

104 / \ /\55

7911

1、首先,建立兩個棧s1和s2,將根節點(8)存入s1中。返回值為vector> res;

2、然後,將s1中節點(即根節點8)彈出,將8存入res中,然後將其左子節點(6)和右子節點(10)存入s2中,此時s1為空,s2中元素為6、10;

3、將s2中的節點彈出,先彈出的節點為10,後彈出的節點為6。彈出10時,將10放入res,將其子節點按照先右子節點(11),後左子節點(9)的順序壓入s1;然後彈出節點6,同樣,將6放入res,並將其右子節點(7)和左子節點(5)壓入s1;此時s1中元素為11、9、7、5;

4、再對s1進行類似操作,可以看出最後一行輸出順序為5、7、9、11,符合題目要求。直到s1和s2均為空,說明樹中所有節點已經遍歷完成。

/*

struct treenode

};*/

class solution

res[row].push_back( node->val );

s2.push(node->left);

s2.push(node->right);

}row++;

while( !s2.empty() )

res[row].push_back( node->val );

s1.push(node->right);

s1.push(node->left);

}row++;

}return res;

}};

3 15 劍指offer 按之字形順序列印二叉樹

請實現乙個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。層序遍歷的高階 每行的節點的訪問順序是相反的,我們可以用兩個棧來隔行儲存,乙個棧中根據另乙個棧的棧頂元素的 左結點 右結點 的順序儲存節點,而另乙個棧根據另...

劍指offer 按之字形順序列印二叉樹

請實現乙個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。我的解法是用兩個棧來列印,第乙個棧st1列印奇數層,第二個棧st2列印偶數層。先將根節點壓入st1,然後將st1中元素出棧並訪問元素,出棧的同時,將每個節點...

劍指offer 按之字形順序列印二叉樹

題目 劍指offer 按之字形順序列印二叉樹 這個題的本質是返回每一層的節點,關鍵是增加每一層的最右側節點作為標記。如果指標到達這個節點,那麼證明此時佇列裡面的都是下一層的節點。關鍵是為什麼不會有下下層的節點,因為現在訪問到last,最多生成下一層的節點,不會有下下層。所以,此時佇列中最後乙個節點就...