使用递归在二叉树中查找鞍点
Finding saddle point in a binary tree using recursion
我想找到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),所以不是鞍点,所以这种方法是不正确的。
最好的解决方法是什么?
编写一个函数 find_saddle
获取一个节点,以及 parent 的最小值(根节点默认为 INT_MAX
)。它将return的值最大child。当函数被调用时,它计算出 a child 可以具有的最大值并且可能是一个鞍点,它本身的最小值和最小值 parent。然后,它以该最小值向左和向右递归,并在每个子树中接收最大值。如果该节点自身的值大于 bolth 子树的最大值但小于 parent 的最小值,那么它就是一个鞍点并且可以……为所欲为。最后,它 return 是它自己的值和两个子树最大值的最大值。
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);
}
此代码假定叶子可以是鞍点,但调整它以排除这些节点并不难。
我想找到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),所以不是鞍点,所以这种方法是不正确的。
最好的解决方法是什么?
编写一个函数 find_saddle
获取一个节点,以及 parent 的最小值(根节点默认为 INT_MAX
)。它将return的值最大child。当函数被调用时,它计算出 a child 可以具有的最大值并且可能是一个鞍点,它本身的最小值和最小值 parent。然后,它以该最小值向左和向右递归,并在每个子树中接收最大值。如果该节点自身的值大于 bolth 子树的最大值但小于 parent 的最小值,那么它就是一个鞍点并且可以……为所欲为。最后,它 return 是它自己的值和两个子树最大值的最大值。
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);
}
此代码假定叶子可以是鞍点,但调整它以排除这些节点并不难。