二叉树的先序遍历,后序遍历究竟是如何与快速排序,归并排序扯上关系?

快速排序的逻辑是,若要对 nums[lo..hi]进⾏排序,我们先找⼀个分界点 p,通过交换元素使得nums[lo..p-1]都⼩于等于 nums[p],且 nums[p+1..hi]都⼤于 nums[p],然后递归地去nums[lo..p-1]和 nums[p+1..hi]中寻找新的分界点,最后整个数组就被排序了。

void sort(int[] nums, int lo, int hi) {
    /****** 前序遍历位置 ******/
    // 通过交换元素构建分界点 p
    int p = partition(nums, lo, hi);
    /************************/
    sort(nums, lo, p - 1);
    sort(nums, p + 1, hi);
}

归并排序的逻辑,若要对 nums[lo..hi]进⾏排序,我们先对 nums[lo..mid]排序,再对nums[mid+1..hi]排序,最后把这两个有序的⼦数组合并,整个数组就排好序了

void sort(int[] nums, int lo, int hi) {
    int mid = (lo + hi) / 2;
    sort(nums, lo, mid);
    sort(nums, mid + 1, hi);
    /****** 后序遍历位置 ******/
    // 合并两个排好序的⼦数组
    merge(nums, lo, mid, hi);
    /************************/
}
先构造分界点,然后去左右⼦数组构造分界点,你看这不就是⼀个⼆叉树的前序遍历吗。先对左右⼦数组排序,然后合并(类似合并有序链表的逻辑),你看这是不是⼆叉树的后序遍历框架

参考链接:https://mp.weixin.qq.com/s/7_jsikVCARPFrJ6Hj1EYsg

posted @ 2022-02-24 20:46  小猫妮  阅读(135)  评论(0编辑  收藏  举报