二叉树的先序遍历代码理解

img


当T等于D时,执行到#127行应该传入的是D的右结点G,递归调用PreOrder(T->rchild)(此时T等于D)时,为什么不是从#123行开始执行,然后执行到if(T!=NULL)退出,因为G后面不是为空了吗,王道是从visit(T)开始的,我的理解是调用不应该从void开始吗,求解答

我给你捋一下:当T= D的时候,也就是要执行PreOrder(D) [T=D]

1124行,首先判断D不为空,进入if的代码块
2125行,执行visite(D)
3) 126行,执行PreOrder(D.left) [T=D.left], 这个时候就进入PreOrder(NULL)4123行,判断D.left 为空,退出PreOrder(D.left)
5) 127行,执行PreOrder(D.right)[T=G] ,这个时候就进入PreOrder(G)
            6)124判断G不为空,进入if的代码块
            7125行, 执行visit(G)
            8)执行PreOrder(G.left) ,这个时候就又是进入PreOrder(NULL)
                       9123行,判断G.left 为空,退出PreOrder(G.left)
            10)执行PreOrder(G.right) ,这个时候就又是进入PreOrder(NULL)
                       11123行,判断G.right为空,退出PreOrder(G.right)
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    回答:

    我参考的是快速排序的代码实现。代码中的变量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)


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^