我想在Left Child Right Sibling Tree中找到节点N的父节点。树已订购儿童,儿童人数没有限制。
Node getParent(Node n)
{
....
return parent;
}
我真的需要帮助,因为没有直接找到它的方法。
答案可以是伪代码或编程语言。
答案 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
不是第一个兄弟姐妹)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;
}
}
}