之前实习笔试的时候刷题一直用的java,也参考某篇文章写过java版的二叉树常见算法,因为马上要转正面试了,这几天都在准备面试,就把之前的翻出来用javascript重新写了一遍,二叉树基本都是递归处理的,也比较简单,就当做热身。用快排求前K大值,另外如果之前java版的作者看到的话可以留言,我会标明文章引用。
Javacript二叉树常见算法实现
节点构造函数和二叉树构造函数
1 | function Node(key) { |
插入节点生成二叉树
1 | binaryTree.prototype.insert = function(root, key) { |
先序遍历
1 | //先序遍历递归方法 |
中序遍历
1 | //中序遍历递归方法 |
后序遍历
1 | binaryTree.prototype.postOrder = function(node) { |
求树的深度
1 | binaryTree.prototype.treeDepth = function(node) { |
判断两棵树结构是否相同
1 | binaryTree.prototype.structCmp = function(root1, root2) { |
得到第k层节点个数
1 | binaryTree.prototype.getLevelNum = function(root, k) { |
求二叉树的镜像
1 | binaryTree.prototype.mirror = function(node) { |
最近公共祖先节点
1 | binaryTree.prototype.findLCA = function(node, target1, target2) { |
测试用
1 | var tree = new binaryTree(); |
快速排序求第K大值
快速排序
1 | function quickSort(array) { |
快速排序改进求第K大值
思想是通过快排把数组切割成左中右三部分,将K与右边数组(当然选左边数组也可以)长度作比较,如果右边数组长度为K-1,则中间元素即为第K大值,如果右边数组长度大于等于K,则第K大元素肯定在右边,则只需要对右边数组递归求K大值,如果右边数组长度小于K-1,则第K大值在左边,在左数组求第k-1-right.length大值即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 function getK(array, k) {
if(array.length <= 1){
return array;
}
let middle = Math.floor(array.length / 2)
let pivot = array.splice(middle, 1);
let left =[], right = [];
for(let i = 0; i < array.length; i++) {
if(array[i] < pivot) {
left.push(array[i]);
} else {
right.push(array[i]);
}
}
if(right.length == k - 1){
return pivot;
} else if (right.length >= k) {
return getK(right, k);
} else {
return getK(left, k-right.length-1);
}
}
另外此方法也不是最佳解法,还有一种比较好的解法是利用建立K个元素的最小堆,新元素替换堆顶元素并调整堆,最后得到的K个元素即为最大的K个元素,时间复杂度NlogK,大家有其他方法或改进意见欢迎留言。