如何在Left Child Right Sibling Tree中找到节点的父节点?

时间:2013-05-11 23:05:23

标签: c++ data-structures tree

我想在Left Child Right Sibling Tree中找到节点N的父节点。树已订购儿童,儿童人数没有限制。

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

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

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

3 个答案:

答案 0 :(得分:0)

从根开始,搜索记住您上次使用左分支的时间。找到密钥后,最后一个左边的节点是父节点。如果没有采取左分支,则没有父母。

BTW,在Wikipedia definition

  

左子,右兄弟二叉树是k-ary树的二叉树表示。1从k-ary树转换为LC-RS二叉树的过程(有时称为如果没有其他信息,Knuth变换2)通常是不可逆的。

如果没有其他信息,短语通常是不可逆的意味着你要做的事情是不可能的。但我不同意,this Wikipedia discussion page

也是如此

答案 1 :(得分:0)

这是我的答案没有经过多次测试但是你可以得到这个想法

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);

答案 2 :(得分:0)

以下是我理解您的数据结构的方法:

  • node.left是以下之一:
    • 上一个兄弟姐妹(如果node不是第一个兄弟姐妹)
    • parent(如果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;
        }
    }
}