简体   繁体   English

如何在C编程中制作打字稿模拟指针?

[英]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.rightroot.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: 您需要:

  1. Make travese accept KDTreeNode | undefined 使travese接受KDTreeNode | undefined KDTreeNode | undefined , or KDTreeNode | undefined
  2. Do something to check that root.rignt and root.left are not undefined before passing them to traverse 在传递traverse之前,请做一些检查root.rigntroot.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被调用时, rightleft已知不被undefined

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM