給定乙個 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...