在二叉搜索树里,寻找两个节点 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); }
相关文章推荐
- [CareerCup] 4.6 Find Next Node in a BST 寻找二叉搜索树中下一个节点
- find all pairs of elements in a balanced BST that sum to a certain number
- Find subarray with given sum
- Given an array of positive and negative integers find the first subarray with zero sum
- Given a tree, find the node with the minimum sum of distances to other nodes
- 【LeetCode450】Delete Node in BST二叉搜索树删除节点
- Find subarray with given sum
- Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
- 【算法面试题】寻找二叉搜索树中两个节点的最近公共祖先节点(转)
- CareerCup Find the ceiling value present in the BST of a given ke
- 【二叉树】寻找二叉树/BST的两个节点的最低公共祖先
- [LeetCode] Inorder Successor in BST 二叉搜索树中的中序后继节点
- Find subarray with given sum
- [leetcode 285] Inorder Successor in BST---查找二叉搜索树中某个节点在中序遍历中的后续节点
- Find the longest substring with k unique distinct characters in a given string (Google)
- LeetCode—***寻找二叉树中任意两个节点之间的最大值Binary Tree Maximum Path Sum
- Find a number in the array having least difference with the given number (n)
- [LeetCode] Delete Node in a BST 删除二叉搜索树中的节点
- No. 09 - Numbers with a Given Sum
- Can not find a java.io.InputStream with the name [downloadFile] in the invocation stack问题解决