1. Add build script for Java.

2. Add height limitation for code blocks in extra.css.
3. Fix "节点" to "结点".
This commit is contained in:
krahets
2023-02-07 04:43:52 +08:00
parent b14568151c
commit ecbf2d1560
54 changed files with 457 additions and 1633 deletions
+4 -4
View File
@@ -61,7 +61,7 @@ TreeNode *rightRotate(TreeNode *node) {
// 更新结点高度
updateHeight(node);
updateHeight(child);
// 返回旋转后子树的根
// 返回旋转后子树的根
return child;
}
@@ -76,7 +76,7 @@ TreeNode *leftRotate(TreeNode *node) {
// 更新结点高度
updateHeight(node);
updateHeight(child);
// 返回旋转后子树的根
// 返回旋转后子树的根
return child;
}
@@ -128,7 +128,7 @@ TreeNode *insertHelper(TreeNode *node, int val) {
updateHeight(node);
/* 2. 执行旋转操作,使该子树重新恢复平衡 */
node = rotate(node);
// 返回子树的根
// 返回子树的根
return node;
}
@@ -186,7 +186,7 @@ TreeNode *removeHelper(TreeNode *node, int val) {
updateHeight(node);
/* 2. 执行旋转操作,使该子树重新恢复平衡 */
node = rotate(node);
// 返回子树的根
// 返回子树的根
return node;
}
+1 -1
View File
@@ -28,7 +28,7 @@ int *levelOrder(TreeNode *root, int *size) {
while (front < rear) {
// 队列出队
node = queue[front++];
// 保存结点
// 保存结点
arr[index++] = node->val;
if (node->left != NULL) {
// 左子结点入队
+3 -5
View File
@@ -6,11 +6,9 @@
#include "../include/include.hpp"
/**
* 合并左子数组和右子数组
* 左子数组区间 [left, mid]
* 右子数组区间 [mid + 1, right]
*/
/* 合并左子数组和右子数组 */
// 左子数组区间 [left, mid]
// 右子数组区间 [mid + 1, right]
void merge(vector<int>& nums, int left, int mid, int right) {
// 初始化辅助数组
vector<int> tmp(nums.begin() + left, nums.begin() + right + 1);
+5 -5
View File
@@ -9,7 +9,7 @@
/* AVL 树 */
class AVLTree {
public:
TreeNode* root; // 根
TreeNode* root; // 根
private:
/* 更新结点高度 */
void updateHeight(TreeNode* node) {
@@ -27,7 +27,7 @@ private:
// 更新结点高度
updateHeight(node);
updateHeight(child);
// 返回旋转后子树的根
// 返回旋转后子树的根
return child;
}
@@ -41,7 +41,7 @@ private:
// 更新结点高度
updateHeight(node);
updateHeight(child);
// 返回旋转后子树的根
// 返回旋转后子树的根
return child;
}
@@ -88,7 +88,7 @@ private:
updateHeight(node); // 更新结点高度
/* 2. 执行旋转操作,使该子树重新恢复平衡 */
node = rotate(node);
// 返回子树的根
// 返回子树的根
return node;
}
@@ -133,7 +133,7 @@ private:
updateHeight(node); // 更新结点高度
/* 2. 执行旋转操作,使该子树重新恢复平衡 */
node = rotate(node);
// 返回子树的根
// 返回子树的根
return node;
}
+1 -1
View File
@@ -16,7 +16,7 @@ vector<int> hierOrder(TreeNode* root) {
while (!queue.empty()) {
TreeNode* node = queue.front();
queue.pop(); // 队列出队
vec.push_back(node->val); // 保存结点
vec.push_back(node->val); // 保存结点
if (node->left != nullptr)
queue.push(node->left); // 左子结点入队
if (node->right != nullptr)
+5 -5
View File
@@ -12,7 +12,7 @@ namespace hello_algo.chapter_tree
/* AVL 树 */
class AVLTree
{
public TreeNode? root; // 根
public TreeNode? root; // 根
/* 获取结点高度 */
public int height(TreeNode? node)
@@ -48,7 +48,7 @@ namespace hello_algo.chapter_tree
// 更新结点高度
updateHeight(node);
updateHeight(child);
// 返回旋转后子树的根
// 返回旋转后子树的根
return child;
}
@@ -63,7 +63,7 @@ namespace hello_algo.chapter_tree
// 更新结点高度
updateHeight(node);
updateHeight(child);
// 返回旋转后子树的根
// 返回旋转后子树的根
return child;
}
@@ -127,7 +127,7 @@ namespace hello_algo.chapter_tree
updateHeight(node); // 更新结点高度
/* 2. 执行旋转操作,使该子树重新恢复平衡 */
node = rotate(node);
// 返回子树的根
// 返回子树的根
return node;
}
@@ -170,7 +170,7 @@ namespace hello_algo.chapter_tree
updateHeight(node); // 更新结点高度
/* 2. 执行旋转操作,使该子树重新恢复平衡 */
node = rotate(node);
// 返回子树的根
// 返回子树的根
return node;
}
+5 -5
View File
@@ -8,7 +8,7 @@ import . "github.com/krahets/hello-algo/pkg"
/* AVL 树 */
type avlTree struct {
// 根
// 根
root *TreeNode
}
@@ -57,7 +57,7 @@ func rightRotate(node *TreeNode) *TreeNode {
// 更新结点高度
updateHeight(node)
updateHeight(child)
// 返回旋转后子树的根
// 返回旋转后子树的根
return child
}
@@ -71,7 +71,7 @@ func leftRotate(node *TreeNode) *TreeNode {
// 更新结点高度
updateHeight(node)
updateHeight(child)
// 返回旋转后子树的根
// 返回旋转后子树的根
return child
}
@@ -130,7 +130,7 @@ func insertHelper(node *TreeNode, val int) *TreeNode {
updateHeight(node)
/* 2. 执行旋转操作,使该子树重新恢复平衡 */
node = rotate(node)
// 返回子树的根
// 返回子树的根
return node
}
@@ -174,7 +174,7 @@ func removeHelper(node *TreeNode, val int) *TreeNode {
updateHeight(node)
/* 2. 执行旋转操作,使该子树重新恢复平衡 */
node = rotate(node)
// 返回子树的根
// 返回子树的根
return node
}
+1 -1
View File
@@ -20,7 +20,7 @@ func levelOrder(root *TreeNode) []int {
for queue.Len() > 0 {
// poll
node := queue.Remove(queue.Front()).(*TreeNode)
// 保存结点
// 保存结点
nums = append(nums, node.Val)
if node.Left != nil {
// 左子结点入队
@@ -74,6 +74,7 @@ public class space_complexity {
/* 平方阶(递归实现) */
static int quadraticRecur(int n) {
if (n <= 0) return 0;
// 数组 nums 长度为 n, n-1, ..., 2, 1
int[] nums = new int[n];
System.out.println("递归 n = " + n + " 中的 nums 长度 = " + nums.length);
return quadraticRecur(n - 1);
+3 -5
View File
@@ -9,11 +9,9 @@ package chapter_sorting;
import java.util.*;
public class merge_sort {
/**
* 合并左子数组和右子数组
* 左子数组区间 [left, mid]
* 右子数组区间 [mid + 1, right]
*/
/* 合并左子数组和右子数组 */
// 左子数组区间 [left, mid]
// 右子数组区间 [mid + 1, right]
static void merge(int[] nums, int left, int mid, int right) {
// 初始化辅助数组
int[] tmp = Arrays.copyOfRange(nums, left, right + 1);
+1 -1
View File
@@ -123,7 +123,7 @@ class QuickSortTailCall {
}
/* 快速排序(尾递归优化) */
static void quickSort(int[] nums, int left, int right) {
public static void quickSort(int[] nums, int left, int right) {
// 子数组长度为 1 时终止
while (left < right) {
// 哨兵划分操作
+5 -5
View File
@@ -10,7 +10,7 @@ import include.*;
/* AVL 树 */
class AVLTree {
TreeNode root; // 根
TreeNode root; // 根
/* 获取结点高度 */
public int height(TreeNode node) {
@@ -42,7 +42,7 @@ class AVLTree {
// 更新结点高度
updateHeight(node);
updateHeight(child);
// 返回旋转后子树的根
// 返回旋转后子树的根
return child;
}
@@ -56,7 +56,7 @@ class AVLTree {
// 更新结点高度
updateHeight(node);
updateHeight(child);
// 返回旋转后子树的根
// 返回旋转后子树的根
return child;
}
@@ -109,7 +109,7 @@ class AVLTree {
updateHeight(node); // 更新结点高度
/* 2. 执行旋转操作,使该子树重新恢复平衡 */
node = rotate(node);
// 返回子树的根
// 返回子树的根
return node;
}
@@ -146,7 +146,7 @@ class AVLTree {
updateHeight(node); // 更新结点高度
/* 2. 执行旋转操作,使该子树重新恢复平衡 */
node = rotate(node);
// 返回子树的根
// 返回子树的根
return node;
}
+1 -1
View File
@@ -18,7 +18,7 @@ public class binary_tree_bfs {
List<Integer> list = new ArrayList<>();
while (!queue.isEmpty()) {
TreeNode node = queue.poll(); // 队列出队
list.add(node.val); // 保存结点
list.add(node.val); // 保存结点
if (node.left != null)
queue.offer(node.left); // 左子结点入队
if (node.right != null)
@@ -4,11 +4,9 @@
* Author: IsChristina (christinaxia77@foxmail.com)
*/
/**
* 合并左子数组和右子数组
* 左子数组区间 [left, mid]
* 右子数组区间 [mid + 1, right]
*/
/* 合并左子数组和右子数组 */
// 左子数组区间 [left, mid]
// 右子数组区间 [mid + 1, right]
function merge(nums, left, mid, right) {
// 初始化辅助数组
let tmp = nums.slice(left, right + 1);
+5 -5
View File
@@ -11,7 +11,7 @@ const { printTree } = require("../include/PrintUtil");
class AVLTree {
/*构造函数*/
constructor() {
this.root = null; //根
this.root = null; //根
}
/* 获取结点高度 */
@@ -44,7 +44,7 @@ class AVLTree {
// 更新结点高度
this.updateHeight(node);
this.updateHeight(child);
// 返回旋转后子树的根
// 返回旋转后子树的根
return child;
}
@@ -58,7 +58,7 @@ class AVLTree {
// 更新结点高度
this.updateHeight(node);
this.updateHeight(child);
// 返回旋转后子树的根
// 返回旋转后子树的根
return child;
}
@@ -108,7 +108,7 @@ class AVLTree {
this.updateHeight(node); // 更新结点高度
/* 2. 执行旋转操作,使该子树重新恢复平衡 */
node = this.rotate(node);
// 返回子树的根
// 返回子树的根
return node;
}
@@ -141,7 +141,7 @@ class AVLTree {
this.updateHeight(node); // 更新结点高度
/* 2. 执行旋转操作,使该子树重新恢复平衡 */
node = this.rotate(node);
// 返回子树的根
// 返回子树的根
return node;
}
@@ -15,7 +15,7 @@ function hierOrder(root) {
let list = [];
while (queue.length) {
let node = queue.shift(); // 队列出队
list.push(node.val); // 保存结点
list.push(node.val); // 保存结点
if (node.left)
queue.push(node.left); // 左子结点入队
if (node.right)
+2 -2
View File
@@ -43,7 +43,7 @@ class AVLTree:
# 更新结点高度
self.__update_height(node)
self.__update_height(child)
# 返回旋转后子树的根
# 返回旋转后子树的根
return child
""" 左旋操作 """
@@ -56,7 +56,7 @@ class AVLTree:
# 更新结点高度
self.__update_height(node)
self.__update_height(child)
# 返回旋转后子树的根
# 返回旋转后子树的根
return child
""" 执行旋转操作,使该子树重新恢复平衡 """
+2 -2
View File
@@ -13,7 +13,7 @@ from include import *
""" Driver Code """
if __name__ == "__main__":
""" 初始化二叉树 """
# 初始化
# 初始化
n1 = TreeNode(val=1)
n2 = TreeNode(val=2)
n3 = TreeNode(val=3)
@@ -29,7 +29,7 @@ if __name__ == "__main__":
""" 插入与删除结点 """
P = TreeNode(0)
# 在 n1 -> n2 中间插入点 P
# 在 n1 -> n2 中间插入点 P
n1.left = P
P.left = n2
print("\n插入结点 P 后\n")
+1 -1
View File
@@ -18,7 +18,7 @@ def hier_order(root: Optional[TreeNode]):
res = []
while queue:
node = queue.popleft() # 队列出队
res.append(node.val) # 保存点值
res.append(node.val) # 保存点值
if node.left is not None:
queue.append(node.left) # 左子结点入队
if node.right is not None:
+3 -5
View File
@@ -4,11 +4,9 @@
* Author: nuomi1 (nuomi1@qq.com)
*/
/**
*
* [left, mid]
* [mid + 1, right]
*/
/* */
// [left, mid]
// [mid + 1, right]
func merge(nums: inout [Int], left: Int, mid: Int, right: Int) {
//
let tmp = Array(nums[left ..< (right + 1)])
+5 -5
View File
@@ -8,7 +8,7 @@ import utils
/* AVL */
class AVLTree {
fileprivate var root: TreeNode? //
fileprivate var root: TreeNode? //
/* */
func height(node: TreeNode?) -> Int {
@@ -40,7 +40,7 @@ class AVLTree {
//
updateHeight(node: node)
updateHeight(node: child)
//
//
return child
}
@@ -54,7 +54,7 @@ class AVLTree {
//
updateHeight(node: node)
updateHeight(node: child)
//
//
return child
}
@@ -112,7 +112,7 @@ class AVLTree {
updateHeight(node: node) //
/* 2. 使 */
node = rotate(node: node)
//
//
return node
}
@@ -155,7 +155,7 @@ class AVLTree {
updateHeight(node: node) //
/* 2. 使 */
node = rotate(node: node)
//
//
return node
}
@@ -14,7 +14,7 @@ func hierOrder(root: TreeNode) -> [Int] {
var list: [Int] = []
while !queue.isEmpty {
let node = queue.removeFirst() //
list.append(node.val) //
list.append(node.val) //
if let left = node.left {
queue.append(left) //
}
@@ -4,11 +4,9 @@
* Author: Justin (xiefahit@gmail.com)
*/
/**
* 合并左子数组和右子数组
* 左子数组区间 [left, mid]
* 右子数组区间 [mid + 1, right]
*/
/* 合并左子数组和右子数组 */
// 左子数组区间 [left, mid]
// 右子数组区间 [mid + 1, right]
function merge(nums: number[], left: number, mid: number, right: number): void {
// 初始化辅助数组
let tmp = nums.slice(left, right + 1);
+5 -5
View File
@@ -12,7 +12,7 @@ class AVLTree {
root: TreeNode;
/*构造函数*/
constructor() {
this.root = null; //根
this.root = null; //根
}
/* 获取结点高度 */
@@ -45,7 +45,7 @@ class AVLTree {
// 更新结点高度
this.updateHeight(node);
this.updateHeight(child);
// 返回旋转后子树的根
// 返回旋转后子树的根
return child;
}
@@ -59,7 +59,7 @@ class AVLTree {
// 更新结点高度
this.updateHeight(node);
this.updateHeight(child);
// 返回旋转后子树的根
// 返回旋转后子树的根
return child;
}
@@ -113,7 +113,7 @@ class AVLTree {
this.updateHeight(node); // 更新结点高度
/* 2. 执行旋转操作,使该子树重新恢复平衡 */
node = this.rotate(node);
// 返回子树的根
// 返回子树的根
return node;
}
@@ -151,7 +151,7 @@ class AVLTree {
this.updateHeight(node); // 更新结点高度
/* 2. 执行旋转操作,使该子树重新恢复平衡 */
node = this.rotate(node);
// 返回子树的根
// 返回子树的根
return node;
}
@@ -16,7 +16,7 @@ function hierOrder(root: TreeNode | null): number[] {
const list: number[] = [];
while (queue.length) {
let node = queue.shift() as TreeNode; // 队列出队
list.push(node.val); // 保存结点
list.push(node.val); // 保存结点
if (node.left) {
queue.push(node.left); // 左子结点入队
}
+5 -5
View File
@@ -10,7 +10,7 @@ pub fn AVLTree(comptime T: type) type {
return struct {
const Self = @This();
root: ?*inc.TreeNode(T) = null, // 根
root: ?*inc.TreeNode(T) = null, // 根
mem_arena: ?std.heap.ArenaAllocator = null,
mem_allocator: std.mem.Allocator = undefined, // 内存分配器
@@ -59,7 +59,7 @@ pub fn AVLTree(comptime T: type) type {
// 更新结点高度
self.updateHeight(node);
self.updateHeight(child);
// 返回旋转后子树的根
// 返回旋转后子树的根
return child;
}
@@ -73,7 +73,7 @@ pub fn AVLTree(comptime T: type) type {
// 更新结点高度
self.updateHeight(node);
self.updateHeight(child);
// 返回旋转后子树的根
// 返回旋转后子树的根
return child;
}
@@ -132,7 +132,7 @@ pub fn AVLTree(comptime T: type) type {
self.updateHeight(node); // 更新结点高度
// 2. 执行旋转操作,使该子树重新恢复平衡
node = self.rotate(node);
// 返回子树的根
// 返回子树的根
return node;
}
@@ -171,7 +171,7 @@ pub fn AVLTree(comptime T: type) type {
self.updateHeight(node); // 更新结点高度
// 2. 执行旋转操作,使该子树重新恢复平衡
node = self.rotate(node);
// 返回子树的根
// 返回子树的根
return node;
}
+1 -1
View File
@@ -18,7 +18,7 @@ fn hierOrder(comptime T: type, mem_allocator: std.mem.Allocator, root: *inc.Tree
while (queue.len > 0) {
var queue_node = queue.popFirst().?; // 队列出队
var node = queue_node.data;
try list.append(node.val); // 保存结点
try list.append(node.val); // 保存结点
if (node.left != null) {
var tmp_node = try mem_allocator.create(L.Node);
tmp_node.data = node.left.?;