Java的AVL树
我不确定这是否正确,因为这是我第一次使用节点编码。但这是我迄今为止的代码,如果有人可以查看它并帮助我理解我是否做错了什么。此外,我的插入/删除方法也给我带来了困难。教授为此给了我们伪代码,但我似乎无法掌握如何将其解释为Java代码,因为我以前从未做过这种类型的代码。主要是因为有一个if语句来检查树的高度,看看树是否平衡,我如何在这个语句中实现高度?非常感谢您的提示或任何帮助,我已经坚持了一段时间了。谢谢 我也不认为我做的构造器正确,我不确定。insert/remove中的返回可以忽略,它只是放在那里以确保其余代码将被编译Java的AVL树,java,binary-tree,nodes,treenode,avl-tree,Java,Binary Tree,Nodes,Treenode,Avl Tree,我不确定这是否正确,因为这是我第一次使用节点编码。但这是我迄今为止的代码,如果有人可以查看它并帮助我理解我是否做错了什么。此外,我的插入/删除方法也给我带来了困难。教授为此给了我们伪代码,但我似乎无法掌握如何将其解释为Java代码,因为我以前从未做过这种类型的代码。主要是因为有一个if语句来检查树的高度,看看树是否平衡,我如何在这个语句中实现高度?非常感谢您的提示或任何帮助,我已经坚持了一段时间了。谢谢 我也不认为我做的构造器正确,我不确定。insert/remove中的返回可以忽略,它只是放在
public class AvlNode{
public static void main(String[]args){
}
//constructor
public class AvlTreeNode{
private int num;
private AvlTreeNode left;
private AvlTreeNode right;
public AvlTreeNode left(){
return this.left;
}
public AvlTreeNode right(){
return this.right;
}
public int value(){
return this.num;
}
}
//method to find the number specified on the node
public AvlTreeNode find(AvlTreeNode t, int x){
if(t == null){
return null;
}
if( t.value() == x){
return t;
}
else if(x < t.value()){
return find(t.left(), x);
}
else{
return find(t.right(), x);
}
}
//method to insert a new node and number to a tree
public AvlTreeNode insert(AvlTreeNode t, int x){
if(t == null){
t = new AvlTreeNode(x, null, null);
return t;
}
if(x < t.value()){
t.left = insert(t.left(), x);
}
return t;
}
//method to remove a node and number from the tree
public AvlTreeNode remove(AvlTreeNode t, int x){
return t;
}
//Inorder traversal method, should print out numbers in ascending order if correct
public void inOrder(AvlTreeNode t){
if(t != null){
inOrder(t.left());
System.out.print(t.value() + " ");
inOrder(t.right());
}
}
//single rotation of nodes to balance tree, rotating leftwards
public static AvlTreeNode singleRotateWithLeft( AvlTreeNode k1){
AvlTreeNode k2 = k1.left;
k1.left = k2.right;
k2.right = k1;
return k2;
}
//single rotation of nodes to balance tree, rotating rightwards
public static AvlTreeNode singleRotateWithRight( AvlTreeNode k2){
AvlTreeNode k1 = k2.right;
k2.right = k1.left;
k1.left = k2;
return k1;
}
//double rotation of nodes towards the left
public static AvlTreeNode doubleRotateWithLeft( AvlTreeNode k3){
k3.left = doubleRotateWithRight(k3.left);
return doubleRotateWithLeft(k3);
}
//double rotation of nodes towards the right
public static AvlTreeNode doubleRotateWithRight( AvlTreeNode k2){
k2.right = doubleRotateWithLeft(k2.right);
return doubleRotateWithRight(k2);
}
}
公共类AvlNode{
公共静态void main(字符串[]args){
}
//建造师
公共类AvlTreeNode{
私有整数;
私有AvlTreeNode左;
私有AvlTreeNode权;
公共AvlTreeNode left(){
把这个还给我;
}
公共AvlTreeNode权限(){
归还这个。对;
}
公共int值(){
返回这个.num;
}
}
//方法查找节点上指定的编号
公共AvlTreeNode查找(AvlTreeNode t,int x){
如果(t==null){
返回null;
}
如果(t.值()==x){
返回t;
}
如果(x
关于构造函数:我认为错误的地方在于,您将用于描述构造函数的AvlTreeNode的内部类弄错了。很可能,您不需要编写显式构造函数,因为默认的(空的)构造函数就可以了
树的构造可视为将其所有节点插入到空树中
关于高度,您可能应该将树的高度视为每个AvlTreeNode的属性(因此,在num
旁边需要一个height
变量)。下一步是实现插入和删除,以便使用正确的局部变换/旋转,并适当增加或减少插入节点及其子节点的高度
编辑:我现在看到您的代码使用了一个带有三个参数的构造函数。您可以使用类似于本示例代码中的构造函数
//inner class for the node
public class AvlTreeNode{
private int num;
private int height;
private AvlTreeNode left;
private AvlTreeNode right;
//this is the constructor!
public AvlTreeNode(int value, AvlTreeNode left, AvlTreeNode right){
this.num = value;
this.left = left;
this.right = right;
this.height = 1;
if (left != null && left.height() >= height){
height = left.height() + 1;
}
if (right != null && right.height() >= height){
height = right.height() + 1;
}
}
public AvlTreeNode left(){
return this.left;
}
public AvlTreeNode right(){
return this.right;
}
public int value(){
return this.num;
}
public int height(){
return height;
}
}
为了确保我理解这一点,你是说我可以把AvlTreeNode的空类作为一个构造函数,其中只有变量?我也不是很好,也不完全理解is构造函数。我有insert/remove伪代码,但只需要弄清楚如何将其实现为java代码。所以在insert方法中,我可以使用t.left=insert(t.left,x)而不是t.left()?我还应该提到在insert方法下有“return t=new AvlTreeNode(x,null,null)”,我不需要在构造函数中使用显式方法吗?啊,我错过了那段代码。是的,您可能需要一个构造函数,该构造函数将num设置为第一个参数,并将左树和右树设置为第二个和第三个参数。此外,在该构造函数中,您可以根据I是子树的高度来计算高度值。请参阅我的答案编辑:我已向您的内部类添加了一个示例构造函数。