当前位置: 首页 > 知识库问答 >
问题:

二叉搜索树计算节点的坐标

夹谷英杰
2023-03-14

我需要得到所有节点的x,y坐标,例如:

        10
   8        15
7    9     13

X:使用顺序遍历访问节点之前已经访问的节点数

Y:节点从根开始的深度

例如对于节点15,x=5(15之前:已经访问过7, 8, 9, 10, 13),y=1(第二级)

树没有父指针

int inorder(Node *node, int x) {

    if (node->left)
        x = inorder(node->left, x);
    x++;
    if (node->right)
        inorder(node->right, x);
    return x;
}



int x0(Node *node) {
    return inorder(node, -1);
}



int findY(Node *node, Node *from) {

    if (node == from)
        return 0;
    else if (node->item < from->item)
        return findY(node, from->left) + 1;
    else
        return findY(node, from->right) + 1;
}

int y0(Node *node) {
    return findY(node, theRoot);
}

结果:x是错误的,y是正确的

打印:

void printCoord() {

    queue<Node*> q;
    q.push(theRoot);


    int curLevel = 0;
    while (q.size() > 0) {
        Node *n = q.front();
        q.pop();

        int x = x0(n);
        int y = y0(n);

        if (y > curLevel) {
            curLevel = y;
            cout << endl;
        }

        cout << n->item << "(" << x << "," << y <<")";
        if (n->left)
            q.push(n->left);
        if (n->right)
            q.push(n->right);
    }

}







AvlTree tree;
tree.insertBalance(10);
tree.insertBalance(8);
tree.insertBalance(15);
tree.insertBalance(7);
tree.insertBalance(9);
tree.insertBalance(13);


tree.printCoord();

结果:

10(2,0)
8(1,1)15(1,1)
7(0,2)9(0,2)13(0,2)

我已经尝试过了(我认为这是不正确的,因为正确的子树遍历不计入节点)

int inorder(Node *node, int x) {

    if (node->left)
        x = inorder(node->left, x);
    x++;
    if (node->right)
        x = inorder(node->right, x);
    return x;
}

结果是

10(5,0)
8(2,1)15(1,1)
7(0,2)9(0,2)13(0,2)

共有2个答案

通迪
2023-03-14

我很肯定这一点:

if (node->right)
    inorder(node->right, x);

应该是:

if (node->right)
    x = inorder(node->right, x);

除非你真的只想计算左侧节点。

姬昊焱
2023-03-14
// your inorder function is not correct
bool inorder(Node* node, int* x, Node* root) {
    if (root==NULL)
        return false;

    if (inorder(node, x, root->left))
        return true;

    if (node==root) //inorder property here
        return true;

    (*x)++;

    if (inorder(node, x, root->right))
        return true;

    return false;

}

int x0(Node *node) {
    int x=0;
    if (inorder(node, &x, theRoot)) //you did't pass root here
        return x;
    else //not found
        return -1;

}

积分:

  1. 您没有传递根并使用查询节点进行检查。那是不对的。您需要从根目录中搜索树。
 类似资料:
  • 我的任务是计算每个节点的深度,并将其存储在Node类中给出的“深度”中。但是我不知道我应该如何处理这个任务。我在互联网上寻找一些示例,但没有找到任何适合我的任务的示例。这是我给定的Node类的代码: 我以为我可以用类似的方法来计算树的高度,但是没有成功。有帮助吗?

  • 我需要创建一个递归方法,它将二进制搜索树的根节点作为参数。这个递归方法随后将返回整个二叉搜索树中节点总数的int值。 这是我目前所掌握的: main方法调用节点如下所示: 所以我是按顺序运行搜索的,一旦我到达一个没有子节点的节点,我就会删除当前节点,返回父节点并继续。我对上面的方法进行了调试,当程序最终计数并删除根节点左右两侧的所有节点并尝试返回1时,程序以NullPointerException

  • 问题内容: 我想在非二叉树中搜索一个项目(任何节点都可以有n个孩子)并立即退出递归。所讨论的节点可以是任何节点,而不仅仅是叶子。 这是我的代码,但我没有完整的搜索。 nNode包含: (是孩子) 和数据对象。 问题答案: 探索第一个孩子后,您不应该退出。您不需要循环前面的语句。

  • 当删除具有两个子节点的节点时,如果指示使用标准的二叉搜索树节点删除算法,我们应该将其替换为右子树的最小节点还是左子树的最大节点?

  • 在“二叉树”中,一个外部节点是一个没有任何子节点的节点,无论是左的还是右的,如果我错了,请纠正我-在“二叉树”中,一个外部节点总是空的,因为根据我的课堂讲稿,一个内部节点总是有两个子节点,即使没有创建,但我们假设该内部节点的子节点是空的。那么,如果外部节点为空,我如何访问它呢? 我将这段代码作为BST节点类的一部分编写: Last方法给我nullPointerException

  • 好的,我必须创建一个递归方法来计算树中的节点,我做到了(变量名是葡萄牙语的,对不起): arvbin是二叉树,esq和dir是对树分支的左右引用。 我以为这会奏效,但由于某种原因,当我尝试运行它时,它返回0。我使用了一些调试,我认为问题在于,当方法完成并返回到原始的非递归方法时,cardinalidade变量被设置为0。我不确定这是否是因为自动装箱会弄乱我的整数并将其转换为int,然后当我调用该方