【问题标题】:Finding saddle point in a binary tree using recursion使用递归在二叉树中查找鞍点
【发布时间】:2015-02-10 18:46:11
【问题描述】:

我想找到 T 的鞍点,二叉树,如果有的话。 鞍点在其所有祖先中具有最小值,但在其所有后代中具有最大值。如果叶子的值低于其所有祖先的值,那么它就是这样的鞍点。

示例树:

              F:15
         E:16        H:17
    B:14         G:16    I:8
 A:8    C:7
           D:5

B 是这样一个鞍点,因为 14 小于 16 和 15,但也大于 8、7 和 5。A、C、D 和 I 是其他鞍点。

我试图想办法递归检查每个子树并证明父节点是其所有后代中的最大值。但是,由于C(16)是其所有后代中的最大值但大于F(15),所以它不是鞍点,所以这种方法是不正确的。

最好的解决方法是什么?

【问题讨论】:

  • A,B,C,I 是鞍点。
  • 是的,A、B、C、I、D。对不起。

标签: algorithm recursion binary-tree


【解决方案1】:

编写一个函数find_saddle,它接受一个节点和父节点的最小值(对于根节点,默认为INT_MAX)。它将返回最大孩子的值。当函数被调用时,它会计算出一个孩子可以拥有的最大值,并且可能是一个鞍,它本身的最小值和最小的父母。然后它以该最小值在左右递归,并接收每个子树中的最大值。如果节点自身的值大于bolth 子树的最大值但小于父节点的最小值,那么它就是一个鞍,并且可以做任何你想做的事情。最后,它返回它自己的最大值和两个子树的最大值。

int find_saddle(node* n, int parent_min=INT_MAX) {
   int child_min = min(n->value, parent_min);

   int left_max = INT_MIN;
   if (n->left)
       left_max = find_saddle(n->left, child_min);

   int right_max= INT_MIN;
   if (n->right) 
       right_max = find_saddle(n->right, child_min);

   int child_max = max(left_max, right_max); 

   if (n->value > child_max && n->value < parent_min)
       do_thing(n);

   return max(child_max, n->value);
}

此代码假定叶子可以是鞍点,但调整它以排除这些节点并不难。

【讨论】:

  • 你能简单解释一下'(n->left ? find_saddle(n->left, child_min) : INT_MIN)' 的作用吗?我不熟悉 ( A ? B(A,..) : C)..
  • @BBbbBB:表达式x = A ? B : Cif (A) x=B; else x=C; 几乎相同。我已将代码简化为更清晰。
猜你喜欢
  • 2021-09-30
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 2018-05-03
  • 2015-09-02
相关资源
最近更新 更多