如果构造二叉树如下
如果我得到一个数字n,那么找出它是否在根的左或右子树中的最快方法是什么?是否有一些易于确定的左子树的数学属性?
注意:这不是一个家庭作业问题,尽管它是我试图解决的更大算法问题的一部分。
答案 0 :(得分:4)
考虑二进制数字。每个孩子都将是父母号码,附加0或1,具体取决于是左还是右。
这意味着根目录左侧的所有内容都将以二进制形式开始,而右侧的任何内容都将以二进制形式开始。
这意味着你应该能够只使用一些移位操作然后进行一些比较来计算它所在的一侧。
我应该注意,我不知道这是否是最有效的方法,但它很容易确定左子树的数学属性。
如其他人所指出的,0或1附加的结果意味着每个数字编码通过子树的路径。第一个1表示树的根,从那时起0表示在该点采用左分支,1表示采用右分支。
因此二进制1001101意味着左,左,右,右,左,右。
这样做的一个明显结果是,二进制数字的数量将确切地确定树中该数字的深度。所以1是顶级(第一级)。 10将是第二级(做出一个选择)。我的例子1001101将处于第7级(六个选择)。我应该注意到,我不熟悉二叉树术语,所以不确定根目录是否通常被认为是第一级或第二级,这也是我明确选择数量的原因。
如果还没有观察到最后一次观察,那么这些数字也会从上到下,从左到右分配。所以第一级是1.接下来是左边的2,右边的3。低于该等级将为4,5,6,7,然后低于8,9,10,11,12,13,14,15等等。这在数学上没有任何用处,但如果你想要想象它可能会有所帮助。
答案 1 :(得分:2)
来自Chris'观察,有一个非常简单的规则:让 x 成为您正在寻找的节点。设 S 是 x 的二进制表示。然后, S 中的数字在第一个最重要的位置之后告诉您来自根的路径: 0 表示向左移动, 1 表示向右移动。
示例: x = 27 10 = 11011 2 ,所以我们需要向右,向左,向右,向右转到那里(领先的1被忽略了。)
这是正确的原因是,如果你向右,你乘以2(二进制左移1)并加1,所以你基本上是附加1.相反,如果你向左,你附加一个0