leetcode_107 Binary Tree Level Order Travelsal II

来源:互联网 发布:保险网络推广 编辑:程序博客网 时间:2024/05/29 19:55

题目分析:

  • 二叉树层序遍历实现,要求输出每层的数据信息(从底层开始输出)。

解题思路:

  • 对比分析

    此题与102题基本思想相同,都是求树的层序遍历,唯一的不同是102是从根节点层开始输出,当此题是从叶节点层开始输出。实现方法基本一样,只需在最后对生成的序列进行逆转操作即可。

  • 递归实现

    1)判断根节点是否问空,不为空,访问;

    2)递归访问当前节点的下一层左子树节点;

    3)递归访问当前节点的下一层右子树节点。

  • 非递归实现

    利用队列实现,具体方法如下:

    1)若树节点非空,则入队;

    2)出队,访问当前节点,并将其左右子节点(非空)分别入队;

    3)循环执行步骤2),直到队列为空即可。

    注意:需要一个变量记录每次节点的数目,这样才能正确输出每次节点信息。由于输出需要

  • 实现程序

    //递归实现void levelTra(TreeNode *root, int level, vector< vector<int> > &result){    // 判断根节点是否为空     if (root == NULL)        return ;    // 不为空,则访问     if (level == result.size())    {        vector<int> temp;        result.push_back(temp);    }    result[level].push_back(root->val);    // 递归访问下一层的左、右子树     levelTra(root->left, level + 1, result);    levelTra(root->right, level + 1, result);}vector< vector<int> > levelOrder(TreeNode *root){    vector< vector<int> > result;    levelTra(root, 0, result);    // 进行逆转操作    return vector< vector<int> >(result.rbegin(), result.rend());} //非递归实现 vector< vector<int> > levelOrder1(TreeNode *root){    vector< vector<int> > result;    if (root == NULL)        return result;    queue<TreeNode *> que;    // 根节点入队     que.push(root);    // 循环遍历,直到队列为空     while (!que.empty())    {        int size = que.size();        vector<int> help;        for (int i = 0; i < size; i++)        {            TreeNode *temp = que.front();            // 出队             que.pop();            help.push_back(temp->val);            // 左子树不为空,则左子树入队             if (temp->left != NULL)                que.push(temp->left);            // 右子树不为空,则右子树入队             if (temp->right != NULL)                que.push(temp->right);        }        result.push_back(help);    }    // 进行逆转操作     reverse(result.begin(), result.end());    return result;}
0 0
原创粉丝点击