如何在 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.rightroot.left 声明如下:

left?: KDTreeNode;
right?: KDTreeNode;

所以他们的类型是KDTreeNode | undefined(因为?)。但是您试图在 traverse 中使用它们,它只接受 KDTreeNode(不接受 | undefined):

traverse(root: KDTreeNode) {

您需要:

  1. 使travese接受KDTreeNode | undefined,或
  2. 在将 root.rigntroot.left 传递给 traverse
  3. 之前,先检查一下 root.rigntroot.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 时,已知 rightleft 不是 undefined