我在网上发现了一个按级别顺序遍历二叉树的程序。下面的代码传递并产生所需的输出:
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],
]
答案 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>