LeetCode 103 二叉树的锯齿形层序遍历

102 和103 都是层次遍历 ,不过103相对于102 有一个改变就是锯齿状,其实考虑一下就是把这一层的数据前后调换一下。层次遍历就是queue,先统计一下每层的节点数,然后把这些节点全部拿出来,再把下一层节点放入,一层一层遍历就可以。 第二个还有递归的解决方法,也是层次遍历,传的引用,然后操作一下vector数据就可以。

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> vecTree;

        if(root == nullptr)
            return vecTree;
        queue<TreeNode*> queTree;
        queTree.push(root);
        int count = 1;
        while(!queTree.empty())
        {
            int TreeSize = queTree.size();  //统计这一层有多少个节点
            int cnt = 0;
            vector<int> vecTmp;
            while(cnt < TreeSize)   //遍历所有的节点,并且添加子节点
            {
                cnt++;
                TreeNode* pNode = queTree.front();
                queTree.pop();
                   vecTmp.push_back(pNode->val);

                if(pNode->left)
                {
                    queTree.push(pNode->left);
                }
                if(pNode->right)
                {
                    queTree.push(pNode->right);
                }
           }
            if((count&1) == 0)   //如果是偶数层记得把vector Reverse一下,调换
                reverse(vecTmp.begin(),vecTmp.end());
            count++;
            vecTree.push_back(vecTmp);
        }
        return vecTree;

    }
};
        vector<vector<int>> vecTree;
        if(root == nullptr)
            return vecTree;
        dfs(vecTree,0,root);
        for(int i = 1; i <vecTree.size();i+=2)
            reverse(vecTree[i].begin(),vecTree[i].end());
        return vecTree;
    }
    void dfs(vector<vector<int>> &vecTree,int deep, TreeNode* root)
    {
        if(root == nullptr)
            return;
        if(deep == vecTree.size()) // 如果当前高度等于数组大小,此时应该增加一个数组,
        {
            vector<int> vecTmp;
            vecTree.push_back(vecTmp);
        }
        vecTree[deep].push_back(root->val);
        dfs(vecTree,deep+1,root->left);
        dfs(vecTree,deep+1,root->right);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值