在某些情况下,能够比较二叉搜索树中的最后一个元素和第一个元素,元素对方式将被证明是有用的。
例如:查找 2 个元素总和为给定数字。(最快的方法是尝试将最小和最大的数字相加,然后根据与给定数字相比得到的总和推进每一端)
^我知道这可以通过使用 2 个堆栈以迭代方式遍历树来完成。我只是在想是否有一种方法可以使用2 个线程来做这样的事情:
pthread_mutex_t MTree1, Mtree2;
pthread_t thread[2];
pthread_attr attr;
int data1, data2;
int tempInorder, tempRevInorder;
int requiredSUM
void mergBST(node*root)
{
pthread_mutex_init(&Mtree1, NULL);
pthread_mutex_init(&Mtree2, NULL);
pthread_attr_setdetachestate(&attr,PTHREAD_CREATE_JOINABLE);
pthread_create(&thread[0],&attr, mergeBSTImplInOrder, void*(root));
pthread_create(&thread[1],&attr, mergeBSTImplRevInOrder, void*(root));
}
void mergeBSTImplInOrder(void *root)
{
root=(node*) root;
if(!root) return;
mergeBSTImpl(root->left);
tempInorder=root->data
/*This is where there has to be conditional checks such that execution would stop right here so I can compare varables **tempInorder** **tempRevInorder** with the variable "requiredSUM"*/
mergeBSTImpl(root->right);
}
void mergeBSTImplRevInOrder(void *root)
{
root=(node*) root;
if(!root) return;
mergeBSTImpl(root->right);
tempRevInorder=root->data;
//A similar situation as the other function.
mergeBSTImpl(root->left);
}
所以......我正在尝试做的事情在逻辑上可能吗?这是我在 stackoverflow 上的第一篇文章。我希望我的格式和事情是正确的。如果不是,请善待。=)
stack 方法至少占用O(logm + logn) 空间。线程方式实际上可以通过更简单的代码和 O(1) 空间来完成
以防万一,我想要完成的是:
2 个函数,每个都运行它自己的线程:
Fn1(比如说):一个,一个以 Inorder 方式递归的函数。
Fn2(比方说):二,一个以逆序方式递归的函数。每次任何一个函数从 BST 读取数据时,它都会将它们存储在静态变量中,并且它必须检查从 2 个函数中保存的两个元素是否可以进行比较。一个来自自身,另一个来自另一个功能。如果还有 2 个元素,则使用 requiredSUM 找到元素的总和。如果变量的总和更大,它会让另一个函数继续,直到它得到下一个(这将是第二小的元素)。这个函数一直存在,直到另一个函数得到它的新元素。进行比较。如果这次总和小于 requiredSUM,则该函数继续执行,另一个函数等待直到该函数获得下一个元素(第二小的元素)。进行比较,直到找到总和为所需目标 Sum 的 2 个元素。
这是一种算法,用于查找排序数组中总和为指定值的所有整数对。除了不是排序数组,我们现在有一个 BST。只是为了显示,我将通过以下方式解决问题的数组版本:
#include <iostream>
#include <algorithm>
using namespace std;
void print_pairs(int * ptr, int num, int sum)
{
std::sort(ptr, ptr + num);
int first = 0;
int last = num - 1;
while (first < last)
{
int s = ptr[first] + ptr[last];
if (s == sum)
{
//cout<<ptr[first]<<“ “<< ptr[last]<<endl;
++first;
--last;
}
else
{
if (s < sum)
++first;
else
--last;
}
}
}
int main()
{
int test[] = {9, 3, 6, 5, 7, -1, 13, 14, -2, 12, 0};
print_pairs(test, sizeof(test) / sizeof(int), 12);
return 0;
}