在线索二叉树中如何求先序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1在线索二叉树中如何求先序、中序的前驱、后继,为什么后续线索二叉树是不完备的?先序前驱:若左标志为1,则左链为线索,指示其前驱;否则

a) 若该结点是二叉树的根,则其前驱为空;

b) 若该结点是其双亲的左孩子或是其双亲的右孩子且其双亲没有左子树,则其前驱为其双亲;

c) 若该结点是其双亲的右孩子且其双亲有左子树,则其前驱为其双亲的左子树中的先序遍历列出的最后一个结点。

先序后继:若右标志为1,则右链为线索,指示其后继;否则,如果有左子树则遍历左子树第一个访问的结点,为其后继;如果没有左子树则遍历右子树第一个访问的结点,为其后继;

中序前驱:若左标志为1,则左链为线索,指示其前驱;否则,遍历其左子树最后访问

的结点,为其前驱

中序后继:若右标志为1,则右链为线索,指示其后继;否则,遍历其右子树第一个访问的结点,为其后继

后续后继:

a) 若该结点是二叉树的根,则其后继为空;

b) 若该结点是其双亲的右孩子或是其双亲的左孩子且其双亲没有右子树,则其后继为其双亲;

c) 若该结点是其双亲的左孩子且其双亲有右子树,则其后继为其双亲的右子树中的后序遍历列出的第一个结点。

求后续后继需要知道双亲结点,而二叉链表无法找到双亲,因此不完备:

5如果只想得到一个序列中前k(k>=5)个最小元素的部分排序序列,可以采用哪些排序方法,最好采用哪种排序方法?

1插入、快速、归并需要全体排序不合适

2起泡、简单选择、堆可以。

堆完成查找总时间:4n+klogn,起泡和简单选择总时间kn,因此堆较好。

5荷兰国旗

问题分析:

这个问题我们可以将这个问题视为一个数组排序问题,这个数组分为前部,中部和后部三个部分,每一个元素(红白蓝分别对应0、1、2)必属于其中之一。由于红、白、蓝三色小球数量并不一定相同,所以这个三个区域不一定是等分的,也就是说如果我们将整个区域放在[0,1]的区域里,由于三色小球之间数量的比不同(此处假设1:2:2),可能前部为[0,0.2),中部为[0.2,0.6),后部为[0.6,1]。我们的思路如下:将前部和后部各排在数组的前边和后边,中部自然就排好了。具体的:

设置两个标志位begin和end分别指向这个数组的开始和末尾,然后用一个标志位current从头开始进行遍历:

1)若遍历到的位置为0,则说明它一定属于前部,于是就和begin位置进行交换,然后current向前进,begin也向前进(表示前边的已经都排好了)。

2)若遍历到的位置为1,则说明它一定属于中部,根据总思路,中部的我们都不动,然后current向前进。

3)若遍历到的位置为2,则说明它一定属于后部,于是就和end位置进行交换,由于交换完毕后current指向的可能是属于前部的,若此时current前进则会导致该位置不能被交换到前部,所以此时current不前进。而同1),end向后退1。

1. void swap (int &var1, int &var2)

2. {

3. int temp = var1;

4. var1 = var2;

5. var2 = temp;

6. }

7.

8. void shuffle(int *array)

9. {

10. int current = 0;

11. int end = N-1;

12. int begin = 0;

13. while( current<=end )

14. {

15. if( array[current] ==0 )

16. {

17. swap(array[current],array[ begin]);

18. current++;

19. begin++;

20. }

21. else if( array[current] == 1 )

22. {

23. current++;

24. }

25. else{//When array[current] = 2

26. swap(array[current],array[ end]);

27. end--;

28. }

29. }

30. }

8对含有n个互不相同的元素的线性表,能否以低于2n-3次比较同时找出最大元素和最小元素?如果能请详细说明算法思想,如果不能说明原因

可以实现。选用锦标赛算法。两两元素比较,淘汰较小的,形如一棵二叉树。树根为最大值(此时用掉n-1次比较)。而最小者一定位于首次被淘汰之列。故只有⎡ n/2⎤个。一共需n-1+⎡ n/2⎤次比较。

9在什么条件下,MSD基数排序比LSD基数排序效率更高?

【解答】由于高位优先的MSD方法是递归的方法,就一般情况来说,不像低位优先的LSD方法那样直观自然,而且实现的效率较低。但如果待排序的排序码的大小只取决于高位的少数几位而与大多数低位无关时,采用MSD方法比LSD方法的效率要高。

10若对有n个元素的有序顺序表和无序顺序

表进行顺序搜索, 试就下列三种情况分别讨论两者在等搜索概率时的平均搜索长度是否相同?

(1) 搜索失败;

(2) 搜索成功, 且表中只有一个关键码等于给定值k的对象;

(3) 搜索成功, 且表中有若干个关键码等于给定值k的对象, 要求一次搜索找出所有对象

【解答】

(1) 不同。因为有序顺序表搜索到其关键码比要查找值大的对象时就停止搜索,报告失败信息,不必搜索到表尾;而无序顺序表必须搜索到表尾才能断定搜索失败。(2) 相同。搜索到表中对象的关键码等于给定值时就停止搜索,报告成功信息。(3) 不同。有序顺序表中关键码相等的对象相继排列在一起,只要搜索到第一个就可以连续搜索到其它关键码相同的对象。而无序顺序表必须搜索全部表中对象才能确定相同关键码的对象都找了出来,所需时间就不相同了。

相关文档
最新文档