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

时间:2014-05-04 06:04:46

标签: c++ algorithm data-structures tree traversal

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

        10
   8        15
7    9     13

X:在使用按顺序遍历

访问节点之前已访问的节点数

Y:根节点的深度

e.g。对于节点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 个答案:

答案 0 :(得分:1)

// 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. 对于任何inorder属性,基本的想法是你走左边,做你想做的,然后走右边。但这可能会根据您的问题而有所不同。
  3. 如果找到查询节点,则不会再进行inorder次呼叫。它会一直返回到x0x包含所需的值。

答案 1 :(得分:0)

我很确定这个:

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

应该是:

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

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