多叉樹的前序遍歷 589 N叉樹的前序遍歷

2021-10-16 23:58:46 字數 1394 閱讀 1072

給定乙個 n 叉樹,返回其節點值的前序遍歷。

n叉樹的定義如下

class node

node(int _val, vector _children) {

val = _val;

children = _children;

例如給定乙個 3叉樹 :

3 2 4

5 6返回其前序遍歷: [1,3,5,6,2,4]。

說明:遞迴法很簡單,你可以使用迭代法完成此題嗎?

思路1首先採用遞迴法,假設當前節點不為空,則將當前節點存入結果集中

遍歷所有孩子節點,向每個孩子節點進行遞迴

遞迴法具體**

vector res; // 結果集

vector preorder(node* root) {

if(root == null){ //判斷當前節點不為空

return res;

res.push_back(root->val); //將當前節點加入結果集

for(int i = 0; i < root->children.size(); i++){ //遍歷所有孩子節點

preorder(root->children[i]); //遞迴進入孩子節點

return res; //返回結果

思路2使用迭代法,不使用遞迴呼叫的方式。

使用棧來輔助,我們一層一層進行遍歷

假設此時我們在處理第n行的節點p1

先把p1的所有兄弟節點(p2,p3,p4,...)存入棧中,等待後續使用

接著把p1存入結果集中,遍歷p1所有孩子節點(pc1,pc2,...),存入棧中,等待後續使用

取出p1的最左孩子節點pc1,依次往下處理,假設此時p1的所有孩子節點都處理完畢了

從棧中取出p2,以此類推使用。

因此整個棧的存放順序為

棧底|pn, pn-1,...,p2,pcn,...,pc2,pc1

也就是說,存棧的時候,區域性逆序儲存

迭代法具體**

vector res;

stack s;

vector preorder(node* root) {

while(root != null){ // 該判斷用來規避初始為空的情況

res.push_back(root->val); // 當前節點存入結果集

//逆序存入所有孩子節點

for(int i = root->children.size() - 1; i >= 0; i--){

s.push(root->children[i]);

//從棧中取出棧頂節點

if(s.empty()){ //棧空,說明遍歷完成

break;

root = s.top();

s.pop();

return res;

589 N叉樹的前序遍歷

遞迴法 if root none return res for leaf in root.children res self.preorder leaf return root.val res 此處加法先後順序決定了是進行先序還是後序 迭代法 if root none return queue re...

589 N叉樹的前序遍歷

給定乙個 n 叉樹,返回其節點值的前序遍歷。例如,給定乙個3叉樹 返回其前序遍歷 1,3,5,6,2,4 definition for a node.class node object def init self,val,children self.val val self.children chi...

樹 LeetCode589 N叉樹的前序遍歷

給定乙個 n 叉樹的根節點 root 返回 其節點值的 前序遍歷 n 叉樹 在輸入中按層序遍歷進行序列化表示,每組子節點由空值 null 分隔。樹形結構的前序遍歷 n樹的節點包含了 子節點鍊錶,節點的資料結構在題目中給出 將節點設為引數遍歷即可n叉樹不存在中序的情況,所以將序列記錄在答案列表 lis...