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


    快速排序的逻辑是,若要对 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

  • 相关阅读:
    JavaScript (new)创建一个对象的过程
    我所理解的promise的then方法
    promise与async和await的区别
    JS Promise实例 then()方法
    电脑上不去网
    es6----set map应用场景
    ES6新特性一览
    es6继承
    es6中class类的全方面理解(一)
    时间处理金字教程
  • 原文地址:https://www.cnblogs.com/wailaifeike/p/15933507.html
Copyright © 2020-2023  润新知