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

在二叉搜索树里,寻找两个节点 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)的辅助空间。

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


非递归中序遍历参考:http://blog.csdn.net/jiyanfeng1/article/details/41529321

本问题的代码如下:

#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);
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值