我给你捋一下:当T= D的时候,也就是要执行PreOrder(D) [T=D]
1)124行,首先判断D不为空,进入if的代码块
2)125行,执行visite(D)
3) 126行,执行PreOrder(D.left) [T=D.left], 这个时候就进入PreOrder(NULL)了
4) 123行,判断D.left 为空,退出PreOrder(D.left)
5) 127行,执行PreOrder(D.right)[T=G] ,这个时候就进入PreOrder(G)
6)124判断G不为空,进入if的代码块
7)125行, 执行visit(G)
8)执行PreOrder(G.left) ,这个时候就又是进入PreOrder(NULL)
9) 123行,判断G.left 为空,退出PreOrder(G.left)
10)执行PreOrder(G.right) ,这个时候就又是进入PreOrder(NULL)
11) 123行,判断G.right为空,退出PreOrder(G.right)
不知道你这个问题是否已经解决, 如果还没有解决的话:回答:
我参考的是快速排序的代码实现。代码中的变量nums表示排序的数组,left和right表示当前排序区间的左右边界。
具体细节上,快速排序采用分治算法,每次选取一个前后元素值的中间值作为基准值,将数组分成比基准值小和比基准值大两段,然后对两段再次进行快排,直到小数组有序为止。
对于如何放左右,我目前掌握了三种方法: 1. 双指针法:左指针指向当前数组区间的左边界,右指针指向当前数组区间的右边界,从左往右扫描数组,如果遇到比基准值大的元素,就将它和右指针指向的元素交换,右指针左移一位,这样就把比基准值小的元素放到了数组的左边。如果遇到比基准值小的元素,继续向右扫描。直到左右指针重合,把基准值和重合点交换,这样就把基准值放到了数组的中间,同时将数组分成了两段。 2. 挖坑法:和双指针法类似,先将基准值挖出来,然后从右往左扫描数组,找到第一个比基准值小的元素,将它填到刚刚挖出来的坑里,然后再从左往右扫描数组,找到第一个比基准值大的元素,将它填到上一个坑里,这样就把比基准值小的元素放到了数组的左边,比基准值大的元素放到了右边。重复这个过程,直到左右指针重合为止。 3. 前后指针法:左指针和右指针分别指向当前数组区间的左右边界,从左往右扫描数组,如果遇到比基准值小的元素,就将它和左指针指向的元素交换,左指针右移一位。如果遇到比基准值大的元素,就将它和右指针指向的元素交换,右指针左移一位。这样就把比基准值小的元素放到了数组的左边,比基准值大的元素放到了右边。重复这个过程,直到左右指针重合为止。
关于代码实现,以双指针法为例,可以写出如下Python代码:
def quick_sort(nums, left, right):
if left >= right:
return
i, j = left, right
pivot = nums[left]
while i < j:
while i < j and nums[j] >= pivot:
j -= 1
nums[i] = nums[j]
while i < j and nums[i] < pivot:
i += 1
nums[j] = nums[i]
nums[i] = pivot
quick_sort(nums, left, i - 1)
quick_sort(nums, i + 1, right)
其中,i和j分别表示左右指针的位置,pivot表示基准值,while循环中的两个子循环分别对应向左扫描和向右扫描,最后将基准值放到重合点即可。快排的入口可以直接调用quick_sort(nums, 0, len(nums) - 1)
。