定義兩個棧 s_l_r、s_r_l 分別負責從左到右和從右到左遍歷某一層的節點,用標誌變量 flag 來控制具體狀況,根節點所在層 flag=1 表示從左到右遍歷,每隔一層改變一次遍歷方向。node
用棧 s_l_r 從左到右遍歷當前層節點時,按照先左子節點再右子節點的順序將這一層節點的子節點依次放入棧 s_r_l 中。code
用棧 s_r_l 從右到左遍歷當前層節點時,按照先右子節點再左子節點的順序將這一層節點的子節點依次放入棧 s_l_r 中。blog
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { vector<vector<int>> result; vector<int> temp; stack<TreeNode *> s_l_r; stack<TreeNode *> s_r_l; if (root) s_l_r.push(root); int flag = 1; // 根節點層從左往右遍歷,而後每隔一層改變遍歷方向 while (!s_l_r.empty() || !s_r_l.empty()) { if (flag) { while (!s_l_r.empty()) { TreeNode * cur = s_l_r.top(); s_l_r.pop(); temp.push_back(cur->val); if (cur->left) s_r_l.push(cur->left); if (cur->right) s_r_l.push(cur->right); } } else { while (!s_r_l.empty()) { TreeNode * cur = s_r_l.top(); s_r_l.pop(); temp.push_back(cur->val); if (cur->right) s_l_r.push(cur->right); if (cur->left) s_l_r.push(cur->left); } } flag = 1 - flag; result.push_back(temp); temp.clear(); } return result; } };
獲取更多精彩,請關注「seniusen」!it