我需要获取所有节点的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)
答案 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;
}
点数:
inorder
次呼叫。它会一直返回到x0
,x
包含所需的值。答案 1 :(得分:0)
我很确定这个:
if (node->right)
inorder(node->right, x);
应该是:
if (node->right)
x = inorder(node->right, x);
除非你真的只想计算左侧节点。