方法:
1)如果节点是叶节点,那么以该节点为根的子树的总和等于该节点的值。
2)如果节点不是叶子节点,那么以该节点为根的子树的总和是该节点值的两倍(假设以该节点为根的树是SumTree)。
[链接] http://www.geeksforgeeks.org/check-if-a-given-binary-tree-is-sumtree/
Qstn:为什么我们需要在它是叶子节点时初始化ls = 0或rs = 0。考虑链接中给出的树,如果我们到达节点4 if(node == NULL || isLeaf(node)) 返回1; 上面的代码返回1(true)回到它被调用的函数,即节点10类似地右侧将true返回到节点10,所以我们现在可以进入下面的循环,因为两个条件都为真 if(isSumTree(node-> left)&& isSumTree(node-> right)) 如果节点为10,我们计算左边和右边的数据,如果在条件中给出,那么为什么条件if(node-> left == NULL)然后ls = 0必要(isn' t已经照顾,因为它是一个叶节点)? 因为return(4 = 0 + 0)将为false并且整个循环将变为false?
int isLeaf(struct node *node)
{
if(node == NULL)
return 0;
if(node->left == NULL && node->right == NULL)
return 1;
return 0;
}
int isSumTree(struct node* node)
{
int ls; // for sum of nodes in left subtree
int rs; // for sum of nodes in right subtree
/* If node is NULL or it's a leaf node then
return true */
if(node == NULL || isLeaf(node))
return 1;
if( isSumTree(node->left) && isSumTree(node->right))
{
// Get the sum of nodes in left subtree
if(node->left == NULL)
ls = 0;
else if(isLeaf(node->left))
ls = node->left->data;
else
ls = 2*(node->left->data);
// Get the sum of nodes in right subtree
if(node->right == NULL)
rs = 0;
else if(isLeaf(node->right))
rs = node->right->data;
else
rs = 2*(node->right->data);
/* If root's data is equal to sum of nodes in left
and right subtrees then return 1 else return 0*/
return(node->data == ls + rs);
}
return 0;
}
答案 0 :(得分:1)
我假设你指的是行
if(node->left == NULL)
ls = 0;
和
if(node->right == NULL)
rs = 0;
当左右孩子不存在时,该解决方案的作者初始化 rs并且ls为0。需要此初始化,因为之前没有对ls和rs的赋值。如果你没有这个步骤,你的ls和rs可能是垃圾值。
您可以在声明时初始化ls和rs值来保存上述检查。
int ls = 0,rs = 0;
希望这有帮助!