[英]How can I make typescript simulated pointers in c programming?
To find the nearest neighbors from a list of locations (latitude, longitude), implemented a function of k dimensional tree. 为了从位置(纬度,经度)列表中找到最近的邻居,实现了k维树的功能。 However, when I try to traverse the k-dimensional-tree, I encountered an error :
但是,当我尝试遍历k维树时,遇到了一个错误:
error TS2345: Argument of type 'KDTreeNode | undefined' is not assignable to parameter of type 'KDTreeNode'.
It seems the "pointers" are assigned in both left/right subtree incorrectly. 似乎“指针”在左/右子树中的分配不正确。 (I was ac programmer, I don't find anything which is equivalent in typescript.)
(我是一名交流程序员,找不到任何与打字稿等效的东西。)
Please comment how to assign nodes of both left/right leaf in typescript correctly. 请评论如何在打字稿中正确分配左右两个叶子的节点。
The following is a full list of code 以下是完整的代码清单
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();
The error is saying what's wrong: root.right
and root.left
are declared like this: 错误是在说什么地方出问题:
root.right
和root.left
的声明如下:
left?: KDTreeNode;
right?: KDTreeNode;
So their type is KDTreeNode | undefined
所以它们的类型是
KDTreeNode | undefined
KDTreeNode | undefined
(because of the ?
). KDTreeNode | undefined
(因为?
)。 But you're trying to use them in traverse
, which only accepts KDTreeNode
(not | undefined
): 但是,您试图在
traverse
使用它们,后者仅接受KDTreeNode
(不| undefined
):
traverse(root: KDTreeNode) {
You need to either: 您需要:
travese
accept KDTreeNode | undefined
travese
接受KDTreeNode | undefined
KDTreeNode | undefined
, or KDTreeNode | undefined
root.rignt
and root.left
are not undefined
before passing them to traverse
traverse
之前,请做一些检查root.rignt
和root.left
是否undefined
The code in traverse
checks that root
isn't undefined
, so you probably just want #1: traverse
的代码检查root
是否undefined
,因此您可能只想#1:
// #1
traverse(root?: KDTreeNode) {
Alternately, though, #2 would look like this: 但是,#2也可能像这样:
// #2
if (root.right) {
this.traverse(root.right);
}
if (root.left) {
this.traverse(root.left);
}
Those guards tell the TypeScript compiler that by the time traverse
is called, right
and left
are known not to be undefined
. 那些警卫告诉打字稿编译器的时候
traverse
被调用时, right
和left
已知不被undefined
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.