Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在左子右同级树中查找节点的父节点?_C++_Data Structures_Tree - Fatal编程技术网

C++ 如何在左子右同级树中查找节点的父节点?

C++ 如何在左子右同级树中查找节点的父节点?,c++,data-structures,tree,C++,Data Structures,Tree,我想在左子右同级树中找到节点N的父节点。树已经命令了子项,并且子项的数量没有限制 Node getParent(Node n) { .... return parent; } 我真的需要帮助,因为找不到直接的方法 答案可以是伪代码或编程语言。从根开始搜索,记住上次使用左分支的时间。找到密钥后,最后一次向左移动的节点就是父节点。如果没有执行左分支,则没有父级 顺便说一句,在 左子右同级二叉树是k元树的二叉树表示形式。从k元树到LC-RS二叉树(有时称为Knuth变换)的转换过程在没有

我想在左子右同级树中找到节点N的父节点。树已经命令了子项,并且子项的数量没有限制

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()。。。所以我必须找到父节点,只知道树的根不,我只知道子节点总是有序的…所以,找到子节点是“当前节点”的节点。基本上,然后你需要从根节点开始,沿着树向下,直到下一个合适的节点是调用该方法的节点,然后返回对当前节点的引用。无论转换是否可逆,该节点显然具有唯一的父节点。如果它没有父母,它就不会在树上。如果它有多个父节点,那么数据结构不是树;问题是:它能被识别吗?如果它总是可以被识别的,那么原始的树总是可以被重建的,并且转换是反向的,也就是说,维基百科的文章是不正确的。经过反思,在这种情况下,我认为这篇文章是错误的(我的“你可以试试这个”是正确的)。我正在编辑我的答案,以反映这一点。这进一步说明了这一点:是的,这种讨论是假的。“如果你不能区分左和右,那么这个过程是不可逆的。”但你当然可以区分左和右。如果你不能,那么它就不会被称为“左孩子右兄弟姐妹树”;它将被称为“儿童和兄弟姐妹混合在一起的树”。