每日一算法题-层序遍历

130 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

一、题目

image.png

#include <vector>
#include <queue>
#include <iostream>
using namespace std;

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

vector<vector<int> > leverOrder(TreeNode* root){
}

int main(int, char**)
{
    TreeNode root(3);
    TreeNode node1(9);
    TreeNode node2(20);
    TreeNode node3(15);
    TreeNode node4(7);
    root.left = &node1;
    root.right = &node2;
    node2.left = &node3;
    node2.right = &node4;

    vector<vector<int> > res = leverOrder(&root);

    for(vector<int>& datas : res){
        for(int& data : datas){
            cout << data << ' ';
        }
        cout << endl;
    }

    return 0;
}

二、分析

根据题意可知,这是一道经典的层序遍历题。
层序遍历的难点在于二叉树结构本身决定了节点不能横向指向,
只能通过父节点索引左右节点,在这种情况下应该怎么去遍历呢?

通过二叉树的特性,很容易想到,第二层是第一层的子节点,第三层是所有第二层的子节点,这个条件下,我们只需要每次都保存当前层的所有子节点就可以实现层序遍历。

三、模拟

1.
层数:1
当前值: 3
保存子节点: 9,20

2.
层数:2
当前值: 9,20
保存子节点: 15,7

3.
层数:3
当前值: 15,7
保存子节点: 空

  1. 遍历结束

四、实现

vector<vector<int> > leverOrder(TreeNode* root){
    vector<vector<int> > res;
    if(!root) return res;
    queue<TreeNode*> que;
    que.push(root);
    TreeNode* cursor;
    while(!que.empty()){
        vector<int> rres;
        size_t count = que.size() + 1;
        while(--count){
            cursor = que.front();
            que.pop();
            rres.push_back(cursor->val);
            if(cursor->left) que.push(cursor->left);
            if(cursor->right) que.push(cursor->right);
        }
        res.push_back(rres);
    }
    return res;
}

五、结言

经典的层序遍历算法是每个程序员都应该熟练掌握的经典算法之一,在平时的工作中,这些基本算法就是基石,通过对经典算法的变种可以解决很多问题。
比如解决判断是否是完全二叉树的问题时,就能很好的决绝问题。

创作不易,留个赞再走吧!如果对文章内容有任何指正,欢迎评论!