检查BT是否为具有T扩展Comparable <T> java的BST

时间:2019-11-23 19:34:35

标签: java binary-search-tree

检查是BT是BST很简单,但是在使用Comparable类时我在算法上苦苦挣扎。

首先,我有给定的BT插入方法:

public void insert(T item){
    //initialize new BT and sets left, right, parent and data to null
    BinaryTree<T> newNode = new BinaryTree<T>();
    newNode.setData(item);

    if (size==0){
        tree = newNode;
        size++;
        return;
    }

    BinaryTree<T> t = tree;
    boolean done = false;

    while (!done){
        int c = item.compareTo(t.getData());
        if (c==0){
            System.out.println("Duplicate key. Can't insert");
            return;
        }
        //need to go left
        else if (c<0){
            //place to insert found
            if (t.getLeft()==null){
                t.setLeft(newNode);
                newNode.setParent(t);
                size++;
                done = true;
            }
            else
                //otherwise go left one branch
                t = t.getLeft();
        }
        //c>0; need to go right
        else{
            //place to insert found
            if (t.getRight()==null){
                t.setRight(newNode);
                newNode.setParent(t);
                size++;
                done=true;
            }
            else
                t = t.getRight();
        }
    }
}

我将4 2 5 1 3都插入BT,并且将1 2 3 4都插入BT 这棵树看起来像:

    4
   / \
  2   5
 / \
1   3


 1
  \
   2
    \
     3
      \
       4

,结果仍然返回true。

有关BST的验证方法:

public static<T extends Comparable<T>> boolean isBinarySearchTree(BinaryTree<T> t){

    if(t ==null){
        return true;
    }
    if(t.getLeft()!=null && t.getLeft().getData().compareTo(t.getData())>0){
        return false;
    }
    if(t.getRight() !=null && t.getRight().getData().compareTo(t.getData())<0){
        return false;
    }
    return isBinarySearchTree(t.getLeft()) && isBinarySearchTree(t.getRight());
}

我想使用T扩展可比较的<>,并将BinaryTree t输入到方法中。
但是我很困惑为什么该方法仍然确定第二个BT也是BST。

1 个答案:

答案 0 :(得分:0)

如何添加额外的高度方法:

const mongoose = require("mongoose");

const StatusSchema = mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  date: {
    type: Date,
    required: true
  },
  comment: {
    type: String,
    required: true
  }
});

module.exports = mongoose.model("status", StatusSchema);

然后在isBinarySearchTree检查中添加额外的if语句:

int height(BinaryTree bt) {
    if (bt == null) {
       return 0;
    }
    return 1 + Math.max(height(bt.getLeft()), height());
}

这会增加O(log n)的复杂度,因为它可能遍历每个级别的树的高度。