102. 二叉树的层序遍历

基础:掌握二叉树的层序遍历

难点:如何将每层的val放在一个vector中 并push到大的vector中

初次实现(创建两个队列):

将root根结点push到q1中,将q1中的所有结点的val存入小vector,再将小vector存入大vector

然后,将q1中的所有结点的左右子树依次push到q2中,继续交换重复上述动作。

以此循环直到两个队列中都没有元素,即遍历完毕!

交换重复:当q1中所有元素都遍历完了,此时q1为空队,而q2在q1遍历的过程中不断有元素入队

                  此时开始遍历q2的元素,q2的元素遍历完了,在遍历的同时q1也有元素不断入队

                  直到q1和q2中都为空队时,说明把整个树遍历完了,此时返回大vector。

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> ans;
        vector<int> cur;
        if (!root) 
            return ans;
        queue<TreeNode*> q1,q2;
        q1.push(root);
        while(!q1.empty()||!q2.empty())
        {
            while(!q1.empty())
            {
                auto node = q1.front();
                q1.pop();
                cur.push_back(node->val);
                if(node->left)  //如果左结点不为空
                    q2.push(node->left);
                if(node->right) //如果右节点不为空
                    q2.push(node->right);
                if(q1.size()==0)
                {
                    ans.push_back(cur);
                    cur.clear();
                } 
            }
            while(!q2.empty())
            {
                auto node = q2.front();
                q2.pop();
                cur.push_back(node->val);
                if(node->left)
                    q1.push(node->left);
                if(node->right)
                    q1.push(node->right);
                if(q2.size()==0)
                {
                    ans.push_back(cur);
                    cur.clear();
                }
            }
        }
        return ans;
    }
};

官方题解:

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector <vector <int>> ret;
        if (!root) {
            return ret;
        }

        queue <TreeNode*> q;
        q.push(root);
        while (!q.empty()) {
            int currentLevelSize = q.size();
            ret.push_back(vector <int> ());
            for (int i = 1; i <= currentLevelSize; ++i) {
                auto node = q.front(); q.pop();
                ret.back().push_back(node->val);
                if (node->left) q.push(node->left);
                if (node->right) q.push(node->right);
            }
        }
        
        return ret;
    }
};

官方只用到了一个队列,节省了内存空间

不同于利用两个队列判断该元素是属于哪一层的:

官方题解是在每次进入while循环时先将此时队列中的元素个数保存下来  (int currentLevelSize = q.size()),再进行一个for循环(循环currentLevelSize)次,这样一来,便可以将每层的元素划分开。(妙啊~~)


附加 二叉树的四种遍历方法:

//该页前中后序遍历都是应用递归方法
void InorderTraversal( BinTree BT )
{
    if( BT ) {
        InorderTraversal( BT->Left );
        /* 此处假设对BT结点的访问就是打印数据 */
        printf("%d ", BT->Data); /* 假设数据为整型 */
        InorderTraversal( BT->Right );
    }
}

void PreorderTraversal( BinTree BT )
{
    if( BT ) {
        printf("%d ", BT->Data );
        PreorderTraversal( BT->Left );
        PreorderTraversal( BT->Right );
    }
}

void PostorderTraversal( BinTree BT )
{
    if( BT ) {
        PostorderTraversal( BT->Left );
        PostorderTraversal( BT->Right );
        printf("%d ", BT->Data);
    }
}

void LevelorderTraversal ( BinTree BT )
{ 
    Queue Q; 
    BinTree T;

    if ( !BT ) return; /* 若是空树则直接返回 */
    
    Q = CreatQueue(); /* 创建空队列Q */
    AddQ( Q, BT );
    while ( !IsEmpty(Q) ) {
        T = DeleteQ( Q );
        printf("%d ", T->Data); /* 访问取出队列的结点 */
        if ( T->Left )   AddQ( Q, T->Left );
        if ( T->Right )  AddQ( Q, T->Right );
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值