您的位置:首页 > 大数据 > 人工智能

在二叉搜索树里,寻找两个节点 Find a pair with given sum in a Balanced BST

2014-11-26 11:08 591 查看

在二叉搜索树里,寻找两个节点 Find a pair with given sum in a Balanced BST

给定一个平衡二叉搜索树和一个目标和sum,写一个函数,如果有一对节点的和等于目标和, 返回true,否则返回false。预期时间复杂度是O(n),并只只能有O(logN)的额外的空间可以使用。修改二叉搜索树是不允许的。注意平衡BST的身高是O(LOGN)。

一个解决办法是创建BST的中序遍历序列数组。一旦我们有了中序遍历序列数组,我们可以在O(n)时间找到那两个元素。该解决方案在O(n)的时间,但需要O(n)的辅助空间。

还有一个方法,同时进行中序遍历和逆中序遍历,遍历的时候计算两个节点的和,如果节点的和大于目标值,那么逆中序遍历下一个节点,否则,中序遍历下一个节点。注意,这里我们只能用非递归的方法进行中序遍历和逆中序遍历,这样才能中止中序遍历(逆中序遍历)转而进行逆中序遍历(中序遍历)。

非递归中序遍历参考:/article/8181613.html

本问题的代码如下:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#include <string.h>

#include <stack>
#include <stdio.h>
#include <stdlib.h>

struct Node{
int data;   Node* left;  Node* right;
Node(int k, Node* l, Node* r): data(k), left(l), right(r){};
};

stack<Node*> st;

void pairSum(Node* root1, stack<Node*> st1, Node* root2, stack<Node*> st2, int sum)
{

int flag1 = 1; // when flag1=1, in-order traversal is allowed.
int flag2 = 1; // when flag2=1, reserver in-order traversal is allowed.
// At the begining, flag1=1 and flag2=1 so that we
// can find the left-most and right-most node
int data1, data2;  // data1 is the current node value from in-order traversal
// data2 is the current node value from reverse in-order traversal
while(1)
{
while(root1 && flag1)
{
st1.push(root1);
root1 = root1->left;
}

while(root2 && flag2)
{
st2.push(root2);
root2 = root2->right;
}

if(st1.size()>0 || st2.size()>0 )
{
if(flag1 && st1.size()>0)
{
root1 = st1.top();
st1.pop();
data1 = root1->data;
}

if(flag2 && st2.size()>0)
{
root2 = st2.top();
st2.pop();
data2 = root2->data;
}

if(data1 + data2 == sum)
{
cout<<data1<<" "<<data2<<endl;
return;
}
else if (data1 + data2 < sum)
{
flag1 = 1;
flag2 = 0;
root1 = root1->right;
}
else
{
flag1 = 0;
flag2 = 1;
root2 = root2->left;
}
}
else
break;
}
}

int main()
{
Node* n1 = new Node(1,NULL,NULL);
Node* n3 = new Node(3,NULL,NULL);
Node* n2 = new Node(2,n1,n3);
Node* n5 = new Node(5,NULL,NULL);
Node* n4 = new Node(4,n2,n5);
Node* n0 = new Node(0,NULL,n4);
/* Constructed binary tree is
0
\
4
/   \
2     5
/  \
1     3  */

int sum = 1;
stack<Node*> st1, st2;
pairSum(n0, st1, n0, st2, sum);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: