检查是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。
答案 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)的复杂度,因为它可能遍历每个级别的树的高度。