通过执行级别顺序遍历并相应地更改,可以使右指针指向右边的兄弟。但是,我不知道同时执行此操作的过程。有什么建议吗?
答案 0 :(得分:0)
在锦标赛问题中,您可以使用灰色代码来确定其左侧或右侧节点的时间。另一种方法是,如果值小于或等于父值,则其为右节点。
答案 1 :(得分:0)
只需做一个BFS并记住关卡和父级。以下是
的c ++代码void BSTRightSibling(BSTNode *root)
{
queue<BSTNode*> q;
map<BSTNode*, BSTNode*> m;
BSTNode* levelNode = root;
q.push(root);
while(! q.empty()) {
BSTNode* n = q.front();
if (n->left) {
q.push(n->left);
m[n->left] = n;
if (n == levelNode) {
levelNode = n->left;
}
}
if (n->right) {
q.push(n.right);
m[n->right] = n;
if (n == levelNode) {
levelNode = n->right;
}
}
q.pop();
if ((!q.empty()) && (n != levelNode)) {
n->right = q.front();
} else {
n->right = NULL;
}
n->left = m[n];
}
}