快速排序、归并排序与二叉树的关系

二叉树遍历(递归实现)

Definition for a binary tree node.
public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { 
        val = x; 
    }
}
前序遍历:根左右
public void preOrderTraverse(TreeNode root) {
    if(root == NULL)
        return ;
    /****** 前序遍历位置 ******/
    System.out.print(root.val + "->"); //显示结点数据,也可改为对结点的其他操作 
    /************************/
    preOrderTraverse(root.left);
    preOrderTraverse(root.right);
}
中序遍历:左根右
public void inOrderTraverse(TreeNode root) {
    if(root == NULL)
        return ;    
    inOrderTraverse(root.left);
    /****** 中序遍历位置 ******/
    System.out.print(root.val + "->");
    /************************/
    inOrderTraverse(root.right);
}
后序遍历:左右根
public void postOrderTraverse(TreeNode root) {
    if(root == NULL)
        return ;    
    postOrderTraverse(root.left);
    postOrderTraverse(root.right);
    /****** 后序遍历位置 ******/
    System.out.print(root.val + "->");
    /************************/
}

快速排序就是个二叉树的前序遍历

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

先对左右子数组排序,然后合并(类似合并有序链表的逻辑),你看这是不是二叉树的后序遍历框架?另外,这不就是传说中的分治算法嘛,不过如此呀。

参考文章:手把手带你刷二叉树(第一期)

你可能感兴趣的:(数据结构与算法,数据结构,算法,二叉树,排序算法)