我有这个代码,我想知道这是否在插入后给出了左右孩子的确切父母,所以我做了这个代码,但我不确定这是否可以得到正确的父母。
public Node insert(int x, Node t)
{
if (t == null)
{
t = new Node(x, null, null);
}
else if (x < t.iData) {
t.leftChild = insert(x, t.leftChild);
t.parent.leftChild = t ;
}
else if (x > t.iData) {
t.rightChild = insert(x, t.rightChild);
t.parent.rightChild = t ;
}
else ; // Duplicate; do nothing
return t;
}
public class Node {
int iData ;
Node leftChild ;
Node rightChild ;
Node parent;
public Node(int iData)
{
this.iData = iData;
leftChild=null;
rightChild=null;
parent=null;
}
public Node(int iData, Node leftChild, Node rightChild) {
this.iData = iData;
this.leftChild = leftChild;
this.rightChild = rightChild;
parent=null;
}
}
答案 0 :(得分:0)
我在您的代码中看到的唯一问题是,当您尝试添加新添加的节点的父级时。考虑这两行::
t.leftChild = insert(x, t.leftChild);
t.parent.leftChild = t;
假设您在一个节点上说 A ,其iData
小于x
且t.leftChild
为NULL
,那么,您重复insert
功能。在递归调用中,因为insert
的第二个参数是NULL
,您创建一个新节点并将其返回,然后将其保存在 A leftChild指针中>(当你返回时)。从递归调用返回后,执行t.parent.leftChild = t;
实际上意味着,您转到 A 的parent
并修改leftChild
parent
1}} A ,而不是新添加的节点的父节点,这对您尝试做什么没有意义。因此,正确的方法是更改将父节点分配给此::
t.leftChild.parent = t; //when x < iData
// Now you are changing the parent of the leftChild of A
同样地,
t.rightChild.parent = t; //when x > iData
但是,考虑到树非常大,你必须插入一个节点,插入一个节点并为其指定一个父值,按照你编写的代码,你将重新分配parent
值节点之前已经分配过的东西,你只是在那里浪费时间。一个更合适的方法是::
void insert(Node t, int x) {
if(t == NULL) { // In case the root of the tree is NULL
t = new Node(x);
} else if(t.iData == x) {
return; // Do nothing
} else if(t.iData > x) { //left branch
if(t.leftChild == NULL) { // This is the place where you have to insert node
t.leftChild = new Node(x);
t.leftChild.parent = t;
} else { // You have more branches to traverse
insert(t.leftChild, x);
// Here you do not unnecessarily assign parent values again.
}
} else { //t.iData < x
if(t.rightChild== NULL) { // This is the place where you have to insert node
t.rightChild= new Node(x);
t.rightChild.parent = t;
} else { // You have more branches to traverse
insert(t.rightChild, x);
// Here you do not unnecessarily assign parent values again,
// when you return from recursion.
}
}
}