二叉树中此条件的说明

时间:2017-04-26 00:20:39

标签: c++

我在网上发现了一个按级别顺序遍历二叉树的程序。下面的代码传递并产生所需的输出:

class Solution {
public:

    std::vector< vector< int >> res;

    void buildVec(TreeNode* root, int level) {
        if(root==NULL)
            return;
        if(res.size()==level)
            res.push_back(vector< int >());

        res[level].push_back(root->val);
        buildVec(root->left, level+1);
        buildVec(root->right, level+1);
    }

    vector<vector<int>> levelOrder(TreeNode* root) {
        res.clear();
        buildVec(root, 0);
        return res;
    }
};

我不明白的是声明:if(res.size()==level)。这句话到底是什么意思?当级别为2时,可以有(最多)4个元素(因为级别从0开始),这大于label(2)的值。那么,这个陈述是如何起作用的?

编辑:所以,如果输入是:

   3
 /  \
9   20
   /  \
  15   7

然后返回的输出将是

[
   [3],
   [9,20],
   [15,7],
]

2 个答案:

答案 0 :(得分:1)

它的原因是避免对buildVec进行第二次递归调用,在结果向量的末尾添加另一个级别向量,即使第一次调用已经为此特定级别添加了一个。

最简单的方法是在没有15和7的示例树上运行示例运行来弄清楚发生了什么。

levelOrder做的第一件事是清空res向量。然后它调用buildVec(root, 0)。在那里root不等于NULL,但它保持res.size() = 0 = level,因此空向量会附加到res,因此res = [[]]。在下一步中,将当前节点的值推入新附加的向量中。所以res = [[3]]

然后调用buildVec(root->left, 1)。在那里,再次root并非res.size() = 1 = level,因此另一个空向量会附加到res,因此res = [[3], []]。我们将值9插入res[1],现在res = [[3], [9]]

在致电buildVec(root->left, 2)buildVec(root->right, 2)时,没有任何事情发生,因为这两个孩子都不存在,即在这些来电中root == NULL返回true。

所以我们继续致电buildVec(root->right, 1)。这是第一次res.size() = 2 != 1 = level。所以我们不附加新的载体。然后我们将值20插入res[1]。所以res = [[3], [9, 20]]

如果检查res.size() == level不存在,我们会在最后添加一个新的空白向量,因此结果将是res = [[3], [9, 20], []]

但事实证明,检查不正确。如果您将树翻转到

     3
   /   \
  20    9
 / \
15  7

它将返回[[3], [20, 9], [15, 7], []]。 正确的检查是res.size() <= level

答案 1 :(得分:0)

if(res.size()==level)
    res.push_back(vector< int >());

此声明只是为res添加另一个向量以获得新级别。

  3
 /  \
9   20
   /  \
  15   7

让我们对节点15采取2级别。

res的值为[[3], [9, 20]]res.size() == 2,条件为真,因此它会为新级别创建一个新向量并插入节点15同样,对于节点7,条件将为false,因为res.size()将变为3,因此节点将插入res[level]向量中而不创建新向量。< / p>