英国夏令时; BST 元素的总和大于其直接子元素的总和

Posted

技术标签:

【中文标题】英国夏令时; BST 元素的总和大于其直接子元素的总和【英文标题】:BST; the sum of BST elements which are greater then the sum of their direct children 【发布时间】:2020-04-15 16:41:12 【问题描述】:

因此,任务是编写一个函数,该函数返回 BST 元素的总和,该总和大于其直接子元素的总和。不计算叶节点。我是这样做的,树为空时的基本情况返回 0,如果它没有儿子也返回 0。然后我检查节点是否有一个或两个孩子以及总和的条件。

int sum(struct node* root) 

if (root== NULL) return 0;
if (root->right == NULL && root->left==NULL) return 0;
if (root->right!= NULL && root->left != NULL)

    if (((root->right)->key + (root->left)->key) < root->key) return root->key;

if (root->right != NULL && root->left==NULL)

    if ((root->right)->key< root->key) return root->key;

if (root->left != NULL && root->right==NULL)

    if ((root->left)->key < root->key) return root->key;

else return sum(root->right) + sum(root->left);

主要:

struct node* root = NULL;

add(&root,-4);
add(&root,6);
add(&root,8);
add(&root,-11);
add(&root,5);
add(&root,7);
add(&root,-20);
printf("%d",sum(root));

它应该返回 -1 (6+8-11-4),但我的函数不起作用我不知道为什么。

【问题讨论】:

在英语中,在描述树结构和进程层次结构等内容时,会避免使用术语“儿子”和“女儿”(以及“父亲”和“母亲”等)。使用中性的“父母”和“孩子”(以及“祖父母”、“孙子”)等。(“兄弟”或“姐妹”的兄弟姐妹。) 您可以而且应该将(root-&gt;right)-&gt;key 写成明确的root-&gt;right-&gt;key。括号不是必需的;经验丰富的 C 程序员出乎意料。如果你正在处理一些奇怪的东西,比如指向结构的指针——比如(*proot)-&gt;right-&gt;key——或者类似的东西,你有时需要括号。但对于常规情况,括号有点模糊。 【参考方案1】:

在您的代码中,else 子句永远不会被执行;你以前的条件已经处理了所有的可能性。

但是,表达式应该被执行。您要么需要将+ sum(root-&gt;left) + sum(root-&gt;right) 添加为三个非退化return 语句的一部分,要么需要将root-&gt;key 保存在局部变量中(默认为零)并一直到return return_value + sum(root-&gt;left) + sum(root-&gt;right);

因此(使用缩写 rv 表示“返回值”:

int sum(struct node* root)

    int rv = 0;
    if (root == NULL || (root->right == NULL && root->left == NULL))
        return rv;
    if (root->right != NULL && root->left != NULL)
    
        if ((root->right->key + root->left->key) < root->key)
            rv = root->key;
    
    if (root->right != NULL && root->left == NULL)
    
        if (root->right->key < root->key)
           rv = root->key;
    
    if (root->left != NULL && root->right == NULL)
    
        if (root->left->key < root->key)
            rv = root->key;
    
    return rv + sum(root->right) + sum(root->left);

警告:原始代码,不受任何编译尝试的影响。

您可以对最后三个“外部”if 测试使用else if 链(使用else 子句代替最后一个测试)以避免重复测试。是否会有可衡量的差异是有争议的。优化器甚至可以自己做出改变。

【讨论】:

以上是关于英国夏令时; BST 元素的总和大于其直接子元素的总和的主要内容,如果未能解决你的问题,请参考以下文章

按时区(BST/GMT、CET/CEST 等)查找下一个夏令时日期

解决flex布局导致子元素的宽度无效的问题

PHP 时区问题 |英国夏令时和格林威治标准时间

flex属性flex-growflex-shrinkflex-basis

Java 的 BST ZoneId 代表啥?

如何在 PHP 中显示 GMT 或 BST?