跟踪BST中的重复项

时间:2014-09-24 16:59:59

标签: java

在这里问了一个类似的问题:[BST with duplicates

用户Sazzadur Ra​​haman发布了完成BST重复的三个场景,但我需要知道如何实现他提到的第三种情况,如下所示:

假设我们正在使用输入:"RABSAB."

括号中带有计数器变量的树将如下所示:

    R(1)
   /  \
  /    \
 A(2)  S(1)
  \
   \
   B(2)

基本上,我希望每个元素(节点)都有一个特定的计数器变量。

我试图在我的插入方法中实现的是什么?或者我需要在我的BSTTree / Node类中使用某种其他方法吗?

****编辑**我的BSTNode课程,根据Compass's推荐进行了更改。

public class BSTNode {
    String key;
    BSTNode left, right;
    int count=1;

    public BSTNode(String key) {
        this.key = key;
    }

    public void insert(String x) {
        if (x.compareTo(this.key) > 0) {
            if (right != null) {
                right.insert(x);
            } else {
                right = new BSTNode(x);
            }
        } //Go right

        else if (x.compareTo(this.key) < 0) {
            if (left != null) {
                left.insert(x);
            } else {
                left = new BSTNode(x);
            }
        } //Go left

        else if (x.compareTo(this.key) == 0) {
            count++;
        } // It's a duplicate, update the count
    }
}

编辑,更新我的输出递增计数器,似乎没有提供正确的输出,我插入"RABSAB"并尝试计算数量重复的节点。

插入如下:

String line = "R A B S A B";
String[] words = line.split(" ");

    for (int i = 0; i < words.length; i++) {
        t1 = t1.Insert(words[i], t1);
        System.out.println(words[i] + " : " + t1.count);
    }

我得到以下输出:

R : 1
A : 1
B : 1
S : 1
A : 1
B : 1

感谢大家的时间。

2 个答案:

答案 0 :(得分:0)

在BSTNode类中,在Insert方法之外,声明int counter = 1;

然后,在你的其他地方,你会做counter++;

因此,在创建节点时,您将拥有1个元素(因为您创建了它,您知道它存在)。

当找到匹配的其他键时,您将增加计数器。

我觉得你的Insert方法存在一个实现问题(遵循约定应该是小写的insert)。你正在传递一个Node t,我认为它是Node的子节点。这可能应该被声明为一个字段,就像counter一样。

具有重复项的伪编码基于整数的节点

public class Node() {
    int value; //node's value
    int counter = 1; //how many items of same type at node
    Node leftChild = null;
    Node rightChild = null;

    public Node(int value) {
        this.value = value;
    }


    public void insert(int newValue) {
        if(newValue > value) {
            if(rightChild != null)
                rightChild.insert(newValue); //we tell the child to deal with it
            else
                rightChild = new Node(newValue); //we make it a child
        }
        else if(newValue < value) {
            if(leftChild != null)
                leftChild.insert(newValue);
            else
                leftChild = new Node(newValue);
        }
        else if(newValue == value) {
            counter++; // we found a duplicate, increase count
        }
    }
}

答案 1 :(得分:0)

这样可行。

 else {
          t.count++;
      } 
 return t;