基本上你有一个充满价值的BST。例如。 1-16 最小值,最大值和值(10,15,3),您需要找到BST中值与给定值之间的最大xor值,这些值在树的最小值和最大值之内。
我想知道是否有办法在没有遍历整个树的情况下执行此操作。 如果min和max不存在,我的方法就是。
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)
}
基本上遵循产生更高xor值的节点。
我遇到的最小和最大问题是,当我对节点> = min&&进行检查时node< = max树将遍历精细,但是当我在范围内时,我可能会将一个坏分支带到该范围之外的数字。
让我解释一下。 走BST 1-16的右侧
9
/ \
/ \
5 13
/ \
11 15
/\ /\
10 12 14 16
下式给出:
最大Xor值为3^12=15
然而,对于我的算法,当我在13节点时,而不是将左侧树变为11,我将正确的树取到15(因为它试图达到16但是超出范围)。
有没有人有更好的解决方案?我应该对BST进行不同的分类吗?我应该使用的是东西而不是BST吗?是否可以在不遍历整个值列表的情况下执行此操作?这里的假设是我将有一个值列表(我在BST中放置的值),然后是我必须应用于值列表的参数列表(min,max,value)。
答案 0 :(得分:1)
我的建议是采用类似于另一个问题的答案的方法:
https://stackoverflow.com/a/9320467/1015955
虽然,这样做的一个问题是你没有使用所有元素都已插入树中的事实。
或许,您可以构建一个树,模拟递归树,然后是上面的解决方案,而不是二叉树。只是我2美分:))