【问题标题】:How to find the parent of a node in Left Child Right Sibling Tree?如何在左子右兄弟树中找到节点的父节点?
【发布时间】:2013-05-11 23:05:23
【问题描述】:

我想在左子右兄弟树中找到节点 N 的父节点。树已经排序了孩子,孩子的数量没有限制。

Node getParent(Node n)
{
   ....
   return parent;
}

我真的需要帮助,因为没有直接的方法可以找到它。

答案可以是伪代码或编程语言。

【问题讨论】:

  • 您知道要查找其父节点的节点吗?现在,如果你有一个父引用,恕我直言,你应该是 find() 节点,它都是从那里开始的。
  • 不,我没有父引用,它是作业的,我无法更改...所以我必须找到父引用,只知道树的根
  • 不,我只知道孩子总是被命令...
  • 那么,找到子节点为“当前节点”的节点。
  • 你基本上需要从根开始,然后沿着树向下工作,直到下一个合适的节点是调用该方法的节点,然后返回对当前节点的引用。

标签: c++ data-structures tree


【解决方案1】:

从根开始,搜索记住你上次选择左分支的时间。当您找到密钥时,您从中取出最后一个左侧的节点就是父节点。如果没有采取左分支,则没有父级。

顺便说一句,在Wikipedia definition

左子右兄弟二叉树是 k-ary 树的二叉树表示。1 从 k-ary 树转换为 LC-RS 二叉树的过程(有时称为 Knuth 变换2) 在没有额外信息的情况下一般是不可逆的。

短语在没有额外信息的情况下一般是不可逆的意味着你试图做的事情是不可能的。但我不同意,this Wikipedia discussion page

也不同意

【讨论】:

  • 无论变换是否可逆,节点显然都有一个唯一的父节点。如果它没有父母,它就不会在树上。如果它有多个父节点,则数据结构不是树。
  • 嗯,当然,除了根以外的每个节点都有一个父节点;问题是:可以识别吗?如果它总是可以被识别,那么原始树总是可以被重建,并且变换反转,即维基百科的文章是不正确的。
  • 经过反思,在这种情况下,我认为这篇文章是错误的(我的“你可以试试这个”是正确的)。我正在编辑我的答案以反映这一点。这进一步阐明了这一点:en.wikipedia.org/wiki/…
  • 是的,这个讨论是假的。 “如果你不能区分左右,那么这个过程是不可逆的。”但当然你可以区分左右。如果你不能,那么它就不会被称为“左子右兄弟树”;它将被称为“孩子和兄弟混合在一起的树”。
【解决方案2】:

这是我的答案,虽然没有经过很多案例的测试,但你可以明白

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;

}

遍历函数的调用方式如下

 traverse(rootofthistree, NULL, integerWearlookingfor);

【讨论】:

    【解决方案3】:

    我是这样理解你的数据结构的:

    • node.left 是以下之一:
      • 上一个兄弟姐妹(如果 node 不是第一个兄弟姐妹)
      • 父母(如果node 是第一个兄弟)
      • null(如果 node 是树根)
    • node.right 是以下之一:
      • 下一个兄弟(如果node不是最后一个兄弟)
      • null(如果 node 是最后一个兄弟)
    • node.child 是以下之一:
      • 第一个孩子(如果node 有任何孩子)
      • null(如果 node 是一片树叶)

    然后您可以通过以下算法获取节点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;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多