二进制搜索树查找父节点

时间:2015-12-19 21:23:22

标签: java binary-search-tree

我有这个代码,我想知道这是否在插入后给出了左右孩子的确切父母,所以我做了这个代码,但我不确定这是否可以得到正确的父母。

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

1 个答案:

答案 0 :(得分:0)

我在您的代码中看到的唯一问题是,当您尝试添加新添加的节点的父级时。考虑这两行::

t.leftChild = insert(x, t.leftChild);
t.parent.leftChild = t;

假设您在一个节点上说 A ,其iData小于xt.leftChildNULL,那么,您重复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.
        }
    }
}