上一篇:二叉树刷题学习笔记1——框架
十大经典排序算法:快速排序和归并排序
二叉树的重要性
- 上一篇章有说到二叉树刷题的两个思路:遍历和分解,而这两个思路,其实就是回溯算法和动态规划的思想。这次我们换一种说法:学过数据结构都知道
快速排序
和归并排序
两种经典的排序算法,实际上,这两种排序的实现思想和框架和二叉树的思想框架大同小异:十大经典排序算法:快速排序和归并排序 - 快速排序框架
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]
void sort(int[] nums, int lo, int hi) {
int mid = (lo + hi) / 2;
// 排序 nums[lo..mid]
sort(nums, lo, mid);
// 排序 nums[mid+1..hi]
sort(nums, mid + 1, hi);
/****** 后序位置 ******/
// 合并 nums[lo..mid] 和 nums[mid+1..hi]
merge(nums, lo, mid, hi);
/*********************/
}
- 可以看到两个排序算法无非就是利用了之前说到的前序位置和后序位置两个位置而已。
- 其实说这么多,也是希望大家能够深入理解这个二叉树刷题的知识点。接下来我们直接看例题。
例题
package package2021_11;
public class Main {
public static void main(String[] args) {
TreeNode val_1=new TreeNode(1);
TreeNode val_3=new TreeNode(3);
TreeNode val_6=new TreeNode(6);
TreeNode val_9=new TreeNode(9);
TreeNode val_left=new TreeNode(2,val_1,val_3);
TreeNode val_right=new TreeNode(7,val_6,val_9);
TreeNode root=new TreeNode(4,val_left,val_right);
TreeNode t=invertTree(root);
print(t);
}
public static TreeNode invertTree(TreeNode root) {
if(root==null)
return null;
//叶子节点
if(root.left==null&&root.right==null)
return root;
TreeNode leftroot=invertTree(root.left);
TreeNode rightroot=invertTree(root.right);
TreeNode left=leftroot;
TreeNode right=rightroot;
root.left=right;
root.right=left;
return root;
}
//二叉树打印
public static void print(TreeNode root) {
if(root==null)
return;
System.out.print(root.val+" ");
print_tree(root);
}
public static void print_tree(TreeNode root) {
if(root==null)
return;
if(root.left!=null)
System.out.print(root.left.val+" ");
if(root.right!=null)
System.out.print(root.right.val+" ");
print_tree(root.left);
print_tree(root.right);
}
}
//二叉树类
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {
}
TreeNode(int val) {
this.val = val;
}
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
结果:
class Solution {
public static void flatten(TreeNode root) {
List<TreeNode> list=new ArrayList<TreeNode>();
if(root==null) {
System.out.println(list);
return;
}
solution(root,list);
TreeNode result=list.get(0);
TreeNode temp=result;
for (int i = 1; i < list.size(); i++) {
temp.left=null;
temp.right=list.get(i);
temp=temp.right;
}
}
public static void solution(TreeNode root,List<TreeNode> list) {
if(root==null) {
return;
}
list.add(root);
solution(root.left,list);
solution(root.right,list);
}
}
结果