C++ 如何在左子右同级树中查找节点的父节点?
我想在左子右同级树中找到节点N的父节点。树已经命令了子项,并且子项的数量没有限制C++ 如何在左子右同级树中查找节点的父节点?,c++,data-structures,tree,C++,Data Structures,Tree,我想在左子右同级树中找到节点N的父节点。树已经命令了子项,并且子项的数量没有限制 Node getParent(Node n) { .... return parent; } 我真的需要帮助,因为找不到直接的方法 答案可以是伪代码或编程语言。从根开始搜索,记住上次使用左分支的时间。找到密钥后,最后一次向左移动的节点就是父节点。如果没有执行左分支,则没有父级 顺便说一句,在 左子右同级二叉树是k元树的二叉树表示形式。从k元树到LC-RS二叉树(有时称为Knuth变换)的转换过程在没有
Node getParent(Node n)
{
....
return parent;
}
我真的需要帮助,因为找不到直接的方法
答案可以是伪代码或编程语言。从根开始搜索,记住上次使用左分支的时间。找到密钥后,最后一次向左移动的节点就是父节点。如果没有执行左分支,则没有父级 顺便说一句,在 左子右同级二叉树是k元树的二叉树表示形式。从k元树到LC-RS二叉树(有时称为Knuth变换)的转换过程在没有额外信息的情况下通常是不可逆的
如果没有额外的信息,这个短语通常是不可逆的,这意味着你试图做的事情是不可能的。但是我不同意,我也不同意,这是我的答案,虽然没有经过很多案例的检验,但是你可以得到这个想法
struct node{
node* left;
node* right;
int i;
node(int _i,node* _left,node* _right){
i=_i;
left = _left;
right = _right;
}
};
node* traverse(node* root,node* parent, int y){
if(root == NULL) return NULL;
if(root->i == y) return parent;
node* result = traverse(root->left,root,y);
if(result) return result;
result = traverse(root->right, parent , y);
if(result) return result;
return NULL;
}
遍历函数被称为like
traverse(rootofthistree, NULL, integerWearlookingfor);
以下是我如何理解您的数据结构:
是以下节点之一:节点。左
- 上一个同级(如果
不是第一个同级)节点
- 父节点(如果
是第一个同级节点)节点
(如果null
是树根)节点
- 上一个同级(如果
是以下节点之一:节点。右侧
- 下一个同级(如果
不是最后一个同级)节点
(如果null
是最后一个同级节点)节点
- 下一个同级(如果
节点。子节点是:
- 第一个子节点(如果
有任何子节点)节点
(如果null
是一个树叶)节点
- 第一个子节点(如果
N
:
node* get_parent(node* N)
{
//define parent of nullptr to be nullptr
if (!N)
return nullptr;
while (true)
{
if (N->left)
{
//N->left is either the previous sibling or the parent
if (N->left->child == N) //N->left is the parent
return N->left;
else //N->left is the previous sibling
N = N->left;
}
else //a node with left==nullptr is the root, so its parent is nullptr
{
return nullptr;
}
}
}
你知道你要找的节点的父节点对吗?现在,如果你有一个父引用,你应该这样做,
find()。。。所以我必须找到父节点,只知道树的根不,我只知道子节点总是有序的…所以,找到子节点是“当前节点”的节点。基本上,然后你需要从根节点开始,沿着树向下,直到下一个合适的节点是调用该方法的节点,然后返回对当前节点的引用。无论转换是否可逆,该节点显然具有唯一的父节点。如果它没有父母,它就不会在树上。如果它有多个父节点,那么数据结构不是树;问题是:它能被识别吗?如果它总是可以被识别的,那么原始的树总是可以被重建的,并且转换是反向的,也就是说,维基百科的文章是不正确的。经过反思,在这种情况下,我认为这篇文章是错误的(我的“你可以试试这个”是正确的)。我正在编辑我的答案,以反映这一点。这进一步说明了这一点:是的,这种讨论是假的。“如果你不能区分左和右,那么这个过程是不可逆的。”但你当然可以区分左和右。如果你不能,那么它就不会被称为“左孩子右兄弟姐妹树”;它将被称为“儿童和兄弟姐妹混合在一起的树”。