2012-03-01 294 views
3

基本上你有一個充滿價值的BST。例如。 1-16 a min,max和value(10,15,3),您需要找到BST中的值和樹中最小值和最大值內的給定值之間的最大異或值。給定均衡的BST。最小值,最大值和最大值,如何找到最小值和最大值內最大的異或值?

我想知道是否有辦法做到這一點,而無需遍歷整個樹。 如果最小和最大不存在,我的方法是。

int xor (Node curent,min,max,value,highestXor){ 
1. if node == null return highestXor 
2. check node.value^value, if > highestXor replace. 
3. check node.left^value and node.right^value, nextNode= highest between them 
4. xor(nextNode,min,max,value,newHighest) 
} 

基本上繼續跟隨產生更高異或值的節點。

問題我正在與最小值和最大值,當我把支票節點> =分鐘& &節點< =最大的樹將穿越很好,但是當我在範圍之內來的,這是可能的我可能會把一個壞分支帶到範圍之外的數字。

讓我解釋一下。 以一個BST的這個右側1-16

 9 
    / \ 
/  \ 
5   13 
     / \ 
     11  15 
     /\  /\ 
     10 12 14 16 

給出:

  • 分鐘= 10
  • 最大= 15
  • 值= 3

最大異或值爲3^12=15

然而,對於我的算法,當我在13節點處,而不是將左邊的樹放到11處,我將右邊的樹放到了15(因爲它試圖達到16,但是這超出了範圍)。

有沒有人有更好的解決方案?我應該以不同的方式整理我的BST嗎?我應該用什麼東西而不是BST?是否有可能在不遍歷整個值列表的情況下執行此操作?這裏的假設是我將有一個值列表(我把它放在BST中),然後列出一些參數(最小值,最大值,值),我必須應用到值列表中。

回答

1

我的建議是遵循類似這樣的回答另一個問題的方法:

https://stackoverflow.com/a/9320467/1015955

雖然一個問題,這將是你不使用的事實,所有的元素都已經插入樹中。

或者,也許,而不是一個二叉樹,你可以構建一棵樹,建模遞歸樹,其次是上述解決方案?只是我的2美分:)