本文为牛客网上66道剑指offer题解
1. 二叉树与双向链表
本题就是二叉树中序遍历的变化,需要熟悉中序遍历非递归的写法,另外注意:
注意pre和p一前一后走,注意第一个节点head的处理:即整个二叉树中最左边的节点。
import java.util.Stack;
public class Solution {
public TreeNode Convert(TreeNode root) {
if (root == null)
return null;
Stack<TreeNode> s = new Stack<TreeNode>();
TreeNode p = root;
TreeNode head = new TreeNode(0);
TreeNode pre = null;
boolean isFirst = true;
while(p != null || !s.isEmpty()){
while(p != null){
s.push(p);
p = p.left;
}
p = s.pop();
if (isFirst){
head = p; //注意第一个节点head的处理 pre = p;
isFirst = false;
}
else{
pre.right = p;
p.left = pre;
pre = p;
}
p = p.right;
}
return head;
}
}
2. 最小的K个数
本题最好的解法就是堆排序,借助本题把堆排序搞清楚。
堆排序就是一个for循环(i从大到小)里面加个调整堆操作,然后交换i和头。
import java.util.ArrayList; public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayList<Integer> res = new ArrayList<Integer>(); if(input == null || input.length == 0 || k < 0 || k > input.length) return res; for (int i = input.length - 1; i > input.length - 1 - k; i -- ){ min_heapify(input, i); swap(input, i, 0); } for(int i = input.length - 1; i > input.length - 1 - k; i--) res.add(input[i]); return res; } private void min_heapify(int[] input, int n){ int child = 0; for(int i = (n - 1)/2; i >= 0; i--){ child = i*2 + 1; if (child < n && input[child] > input[child + 1]) child ++; if (input[child] < input[i]) swap(input, i, child); } } private void swap(int[] array, int i, int j){ int tmp = array[i]; array[i] = array[j]; array[j] = tmp; } }
基于快排的版本:
import java.util.ArrayList; public class Solution { private int K = 0; public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayList<Integer> res = new ArrayList<Integer>(); if (input == null || input.length == 0 || k < 0 || k > input.length) return res; K = k; QuickSort(input, 0, input.length - 1); for(int i = input.length - 1; i >= input.length -K ;i--) res.add(input[i]); //for(int i: input) //System.out.println(i); return res; } private void QuickSort(int[] A, int l, int r){ if (l >= r) return; int i = l, j = r; int tmp = A[i]; while(i< j){ while(i < j && A[j] < tmp) j--; A[i] = A[j]; while(i < j && A[i] > tmp) i++; A[j] = A[i]; } A[i] = tmp; if(A.length - i >= K) //如果后面K个已经有序,提前返回即可 return; QuickSort(A, l, i - 1); QuickSort(A, i+1, r); } }