從上到下打印二叉樹 III

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

/**
 * 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>> levelOrder(TreeNode* root) {
        if(root == NULL) return {};
            deque<TreeNode*> dequeNode;
            vector<vector<int>> ret;
            //根節點入隊列
            dequeNode.push_back(root);
            //從左到右打印flage爲true
            bool flage = true;
        while(!dequeNode.empty()){
            //一層中含有的節點先用變量保存下來,不然後面有節點加入隊列後size()有變化
            int layerSize = dequeNode.size();
            //一層的vector
            vector<int> layerTempVal;
            TreeNode *pNode = NULL;
            for(int i = 0; i < layerSize; i++){
                //從左到右打印,先取雙隊列的左邊節點(前面),也就是右邊放入節點,前面取出節點
                if(flage){
                    //訪問雙隊列節點,雙隊列前面取節點
                    pNode = dequeNode.front();  
                     //刪除該節點
                     dequeNode.pop_front();
                     //雙隊後面放節點,先左後右
                     if(pNode->left != NULL) dequeNode.push_back(pNode->left);
                     if(pNode->right != NULL) dequeNode.push_back(pNode->right);
                }else{
                    //從右到左打印,先取雙隊列右邊的節點(後面),也就是雙隊列的後面取節點
                    //前面放節點
                    pNode = dequeNode.back();
                    //刪除該節點
                    dequeNode.pop_back();
                    //雙隊列前面放節點,先右後左
                    if(pNode->right != NULL) dequeNode.push_front(pNode->right);
                    if (pNode->left != NULL)dequeNode.push_front(pNode->left);
                }
                //pNode-val加入層節點vector
                layerTempVal.push_back(pNode->val);
            }
            //一層結束了,該層的vector 加入大vector,flage 取逆
            flage = !flage;
            if(!layerTempVal.empty()){
                ret.push_back(layerTempVal);
            }
         }
         return ret;   
    }
};

 C++:deque 的操作

元素訪問操作:

(public member function )

operator[]

直接訪問指定位置的元素

at

直接訪問指定位置的元素,指定位置超出有效範圍會報出異常

front

訪問首元素

back

訪問尾元素


修改元素操作:

(public member function )

assign

分配容器的內容

push_back

在尾部添加一個元素

push_front

在首部添加一個元素

pop_back

在尾部刪除一個元素

pop_front

在首部刪除一個元素

insert

迭代器位置插入元素,或者插入連續的序列

erase

擦除迭代器位置的元素,或者擦除連續的序列

swap

交換兩個容器的內容

clear

清空容器的內容

emplace (C++11)

在迭代器位置插入元素(emplace使用直接構造函數,insert使用複製構造函數)

emplace_front (C++11)

在首部添加一個元素

emplace_back (C++11)

在尾部添加一個元素

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章