如何在 C 编程中制作打字稿模拟指针?
How can I make typescript simulated pointers in c programming?
为了从位置列表(纬度、经度)中找到最近的邻居,实现了 k 维树的功能。但是,当我试图遍历k维树时,我遇到了一个错误:
error TS2345: Argument of type 'KDTreeNode | undefined' is not assignable to parameter of type 'KDTreeNode'.
似乎 "pointers" 在两个 left/right 子树中的分配不正确。 (我是一名 c 程序员,我没有找到任何与打字稿等效的东西。)
请评论如何在 typescript 中正确分配两个 left/right 叶子的节点。
以下为完整代码清单
export type Point = number[];
export interface KDTreeNode {
point: Point;
left?: KDTreeNode;
right?: KDTreeNode;
}
export class KDTree {
root: KDTreeNode;
points: Point[];
constructor(points: Point[]) {
this.root = { point: [], left: undefined, right: undefined };
this.points = points;
this.buildTree(this.root, this.points);
}
buildTree(node: KDTreeNode, points: Point[], depth: number = 0): void {
let axis: number = -1;
let median: number = -1;
// Select axis based on depth so that axis cycles through all valid values
axis = depth % points[0].length;
console.log("points :" + points);
// sort point array
points.sort((a, b) => a[axis] - b[axis]);
console.log("points.length :" + points.length);
console.log("points.sort :" + points);
median = Math.floor(points.length / 2);
// build and return node
node.point = points[median];
const leftPoints = points.slice(0, median);
console.log("leftPoints.length :" + leftPoints.length);
if (leftPoints.length) {
node.left = { point: [], left: undefined, right: undefined };
this.buildTree(node.left, leftPoints, depth + 1);
}
const rightPoints = points.slice(median + 1);
console.log("rightPoints.length :" + rightPoints.length);
if (rightPoints.length) {
node.right = { point: [], left: undefined, right: undefined };
this.buildTree(node.right, rightPoints, depth + 1);
}
}
treeBrowser() {
this.traverse(this.root);
}
traverse(root: KDTreeNode) {
if (root) {
console.log(root.point);
this.traverse(root.right);
this.traverse(root.left);
}
};
}
export const KDTreeMain = () => {
var points = [[3, 6], [17, 15], [13, 15], [6, 12], [9, 1], [2, 7], [10, 19]];
var newTree = new KDTree(points);
newTree.treeBrowser();
};
KDTreeMain();
错误是说出了什么问题:root.right
和 root.left
声明如下:
left?: KDTreeNode;
right?: KDTreeNode;
所以他们的类型是KDTreeNode | undefined
(因为?
)。但是您试图在 traverse
中使用它们,它只接受 KDTreeNode
(不接受 | undefined
):
traverse(root: KDTreeNode) {
您需要:
- 使
travese
接受KDTreeNode | undefined
,或
- 在将
root.rignt
和 root.left
传递给 traverse
之前,先检查一下 root.rignt
和 root.left
是否不是 undefined
traverse
中的代码检查 root
不是 undefined
,因此您可能只需要 #1:
// #1
traverse(root?: KDTreeNode) {
或者,#2 看起来像这样:
// #2
if (root.right) {
this.traverse(root.right);
}
if (root.left) {
this.traverse(root.left);
}
那些守卫告诉 TypeScript 编译器,在调用 traverse
时,已知 right
和 left
不是 undefined
。
为了从位置列表(纬度、经度)中找到最近的邻居,实现了 k 维树的功能。但是,当我试图遍历k维树时,我遇到了一个错误:
error TS2345: Argument of type 'KDTreeNode | undefined' is not assignable to parameter of type 'KDTreeNode'.
似乎 "pointers" 在两个 left/right 子树中的分配不正确。 (我是一名 c 程序员,我没有找到任何与打字稿等效的东西。)
请评论如何在 typescript 中正确分配两个 left/right 叶子的节点。
以下为完整代码清单
export type Point = number[];
export interface KDTreeNode {
point: Point;
left?: KDTreeNode;
right?: KDTreeNode;
}
export class KDTree {
root: KDTreeNode;
points: Point[];
constructor(points: Point[]) {
this.root = { point: [], left: undefined, right: undefined };
this.points = points;
this.buildTree(this.root, this.points);
}
buildTree(node: KDTreeNode, points: Point[], depth: number = 0): void {
let axis: number = -1;
let median: number = -1;
// Select axis based on depth so that axis cycles through all valid values
axis = depth % points[0].length;
console.log("points :" + points);
// sort point array
points.sort((a, b) => a[axis] - b[axis]);
console.log("points.length :" + points.length);
console.log("points.sort :" + points);
median = Math.floor(points.length / 2);
// build and return node
node.point = points[median];
const leftPoints = points.slice(0, median);
console.log("leftPoints.length :" + leftPoints.length);
if (leftPoints.length) {
node.left = { point: [], left: undefined, right: undefined };
this.buildTree(node.left, leftPoints, depth + 1);
}
const rightPoints = points.slice(median + 1);
console.log("rightPoints.length :" + rightPoints.length);
if (rightPoints.length) {
node.right = { point: [], left: undefined, right: undefined };
this.buildTree(node.right, rightPoints, depth + 1);
}
}
treeBrowser() {
this.traverse(this.root);
}
traverse(root: KDTreeNode) {
if (root) {
console.log(root.point);
this.traverse(root.right);
this.traverse(root.left);
}
};
}
export const KDTreeMain = () => {
var points = [[3, 6], [17, 15], [13, 15], [6, 12], [9, 1], [2, 7], [10, 19]];
var newTree = new KDTree(points);
newTree.treeBrowser();
};
KDTreeMain();
错误是说出了什么问题:root.right
和 root.left
声明如下:
left?: KDTreeNode;
right?: KDTreeNode;
所以他们的类型是KDTreeNode | undefined
(因为?
)。但是您试图在 traverse
中使用它们,它只接受 KDTreeNode
(不接受 | undefined
):
traverse(root: KDTreeNode) {
您需要:
- 使
travese
接受KDTreeNode | undefined
,或 - 在将
root.rignt
和root.left
传递给traverse
之前,先检查一下
root.rignt
和 root.left
是否不是 undefined
traverse
中的代码检查 root
不是 undefined
,因此您可能只需要 #1:
// #1
traverse(root?: KDTreeNode) {
或者,#2 看起来像这样:
// #2
if (root.right) {
this.traverse(root.right);
}
if (root.left) {
this.traverse(root.left);
}
那些守卫告诉 TypeScript 编译器,在调用 traverse
时,已知 right
和 left
不是 undefined
。