剑指 Offer从上到下打印二叉树 II(C++/Java双重实现)

1.问题描述

在这里插入图片描述

2.问题分析

本题其实就是深度优先搜索和广度优先搜索
深度优先搜索主要理由递归,具体思路看代码
广度优先搜索主要是利用队列,我们定义一个队列,分别对每一层结点进行操作,整个BFS循环如下:

新建一个临时列表 tmp ,用于存储当前层打印结果
当前层打印循环: 循环次数为当前层节点数(即队列长度,每一次队列长度其实就是某一层的元素的个数);
出队: 队首元素出队,记为 t;
打印: 将 t->val 添加至 tmp 尾部;
添加子节点: 若 t 的左(右)子节点不为空,则将左(右)子节点加入队列 queue ;
将当前层结果 tmp 添加入 vec 。
返回值: 返回打印结果列表 vec 即可。

3.代码实现

3.1C++代码(BFS)

/**
 * 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) {
    vector<vector<int>> vec;
     queue<TreeNode*> q;
      if(root!=NULL)
      q.push(root);
     
      while(!q.empty())
      {
           vector<int> tem;
           int len=q.size();//表示每一层的结点个数
           for(int i=0;i<len;i++)
        {
            TreeNode *t=q.front();//返回队列中的第一个元素
            tem.push_back(t->val);
            q.pop();//既然第一个元素已经使用过了就出队
            if(t->left!=NULL)
            q.push(t->left);
            if(t->right!=NULL)
            q.push(t->right);
        }
        vec.push_back(tem);
      }
      return vec;
    }
};

3.2Java代码(DFS)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    private List<List<Integer>> ret;
    public List<List<Integer>> levelOrder(TreeNode root) {
        ret = new ArrayList<>();
        dfs(0, root);
        return ret;
    }
    private void dfs(int depth, TreeNode root) {
        //递归出口
        if (root == null) {
            return;
        }
        if (ret.size() == depth) {
         ret.add(new ArrayList<>());//每新进来一层就添加一个新的集合对象(仅仅添加一次)
        }
        ret.get(depth).add(root.val);
        //每一层互补影响
        dfs(depth + 1, root.left);
        dfs(depth + 1, root.right);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_45737068/article/details/107937916