繁体   English   中英

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

[英]Binary search tree compute the coordinate of nodes

我需要获取所有节点的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)
// 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. 您没有传递根目录,而是与查询节点进行了检查。 那是不对的。 您需要从根目录搜索树。
  2. 对于任何有序属性,基本思想是您先左走,然后做您想做的,然后再向右走。 但这可能会因您的问题而异。
  3. 如果找到查询节点,则不会进行进一步的inorder调用。 它一直返回到x0其中x包含所需的值。

我很确定:

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

应该是:

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

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

暂无
暂无

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

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