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

1.问题描述

在这里插入图片描述

2.问题分析

简单的广度优先搜索和深度优先搜索问题,要用到反转容器的元素顺序的函数reverse(begin(tem),end(tem));

3.代码实现

3.1C++代码

/**
 * 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);
     int cnt=0;
      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);
        }
        cnt++;
        if(cnt%2==1)
        vec.push_back(tem);
        else
        {
            reverse(begin(tem),end(tem));
              vec.push_back(tem);
        }

      }
      return vec;

    }
};

3.2Java代码

public 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 LinkedList<>());
        }
        if ((depth & 1) == 1) {
            ret.get(depth).add(0, root.val);
        } else {
            ret.get(depth).add(root.val);
        }
        dfs(depth + 1, root.left);
        dfs(depth + 1, root.right);
    }
}

猜你喜欢

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