二叉樹樹的層次遍歷實現

2022-04-10 16:21:44 字數 2403 閱讀 2161

二叉樹的所有的操作基本上都是跟遍歷相關的,二叉樹的深度遍歷(先序、中序、後序)都設計棧的操作,但是二叉樹的廣度搜尋(層次遍歷)用到的就是佇列的操作。

注意一點,二叉樹的層次的遍歷要得到的結果是把所有的資訊放到乙個一維的陣列中,還是放到乙個二維的陣列中

vectorprintfromtoptobottom(treenode *root) 

//while

return result;

}

上面的**實現是把遍歷的結果放到一維陣列中,所以僅僅用到了乙個佇列。

如果要把最後遍歷的結果儲存到二維陣列中,樹的每一層的結點儲存在一起,那麼要兩個佇列分別遍歷不同的層次:

vector> levelorder(treenode* root) 

queuecurrent, next;

const treenode *ptmp = null;

vectorlevel;

current.push(root);

while(!current.empty())

if(ptmp->right)

}//while

result.push_back(level);

level.clear();

swap(current, next);

}//while

}

上面的方法是利用兩個佇列實現的層次遍歷,其實用乙個佇列也是可以的。

vector> levelorder(treenode *root) 

if(top->right)

}//for

result.push_back(line);

line.clear();

}//while

return result;

}

通過獲取queue的size可以知道這層的結點的個數。然後把這層遍歷完,下一層的全部加入到佇列的後面。

對於每層倒序的那種問題,最後把result.push_back(line)換成result.insert(result.begin(), line)就好了。

先看一下遍歷的樣子:

具體的遍歷方法是用兩個棧,每個棧遍歷一層,然後交替遍歷。

vector> zigzaglevelorder(treenode *root) 

stacks1;

stacks2;

s1.push(root);

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

//while

if(!line.empty())

res.push_back(line);

line.clear();

while(!s2.empty())

//while

if(!line.empty())

res.push_back(line);

line.clear();

}//while

return res;

}

對於二叉樹層次的遍歷可能不會像二叉樹深度遍歷的應用那麼廣泛,但是看下面的應用:

判斷一棵二叉樹是否為對稱的,先看一下遞迴的形式:

//判斷對稱二叉樹的遞迴形式

bool issymmetric(treenode* root)

return subtreesym(root->left, root->right);

}bool subtreesym(treenode *left, treenode *right)

if((left == null && right != null) || (left != null && right == null) ||(left->val != right->val))

return subtreesym(left->left, right->right) && subtreesym(left->right, right->left);

}

其實迭代的形式很簡單,就是從樹的根開始,把一棵樹分成一棵大的左子樹和一棵大的右子樹,然後分別層次遍歷。到每隊結點的時候都要比較他們的null的性質和val值的大小。由於是樹和自己的映象比較,所以注意左右孩子入佇列的先後。

//判斷對稱二叉樹的迭代形式

bool issymmetric(treenode* root)

q1.push(root->left);

q2.push(root->right);

while(!q1.empty() && !q2.empty())

if(tmp1 != null)

}//while

return true;

}

層次遍歷二叉樹

問題 假定根節點位於第0層 1.層次遍歷二叉樹 每層換行分開 2.層次遍歷二叉樹指定的某層 本文 例如 上圖中1.123 4567 82.第三層 78可以看出得出第二問的解,第一問迎刃而解了,所以從問題二下手 1.層次遍歷二叉樹指定的某層 可以得出這樣的乙個結論 遍歷二叉樹的第k層,相當於遍歷二叉樹...

二叉樹層次遍歷

題目描述 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。思路 二叉樹的層次遍歷,利用棧的先進後出的特性。struct treenode class solution res.push back temp while m.empty m中是從左往右入棧,這裡把它反過來,s中是從右往左...

二叉樹層次遍歷

層次遍歷二叉樹,每一次儲存在list中,結果按從葉子層到根,從左到右的順序儲存 一 class solution return lists 相當於在先序的基礎上改進,level是每個node所在的層次。如果lists大小和level相等,說明開始新一層的儲存。如果不等,則直接把值存入相應層次的lis...