Java 实现AVL树插入
我需要在内部实现AVL树 该算法可在上找到 以下是我的全部代码 rotateLeft被调用两次,但如果逻辑正在工作,则对于以下输入可能只应调用一次:Java 实现AVL树插入,java,data-structures,tree,avl-tree,Java,Data Structures,Tree,Avl Tree,我需要在内部实现AVL树 该算法可在上找到 以下是我的全部代码 rotateLeft被调用两次,但如果逻辑正在工作,则对于以下输入可能只应调用一次: 2-3(根部)-4(右侧)-5(右侧)-6(右侧) 我应该得到什么: 2(BF=0)3(BF=-1)4(BF=0)5(BF=0)6(BF=0) 3(BF=-1)2(BF=0)5(BF=0)4(BF=0)6(BF=0) 我得到的: 2(BF=0)3(BF=-2)3(BF=0)4(BF=-1)4(BF=0)5(BF=0)6(BF=0) 3(BF=-2)
2-3(根部)-4(右侧)-5(右侧)-6(右侧) 我应该得到什么:
2(BF=0)3(BF=-1)4(BF=0)5(BF=0)6(BF=0)
3(BF=-1)2(BF=0)5(BF=0)4(BF=0)6(BF=0) 我得到的:
2(BF=0)3(BF=-2)3(BF=0)4(BF=-1)4(BF=0)5(BF=0)6(BF=0)
3(BF=-2)2(BF=0)4(BF=-1)3(BF=0)5(BF=0)4(BF=0)6(BF=0) 注:这是来自hackerrank的问题,可在
/*类节点定义为:
类节点
int-val//价值
int-ht//高度
左淋巴结//左撇子
节点权//对的孩子
*/
静态节点插入(节点根,int val)
{
Node newNode=新节点();
newNode.val=val;
插入(根,val);
//顺序(根);
返回根;
}
静态int insertT(节点根,int val){
Node newNode=新节点();
Node tempNode=root;
newNode.val=val;
int-bf=0;
int-pbf=0;
if(tempNode.left==null&&tempNode.val>val){
tempNode.left=newNode;
bf=setHt(tempNode.left)-setHt(tempNode.right);
返回高炉;
}
if(tempNode.right==null&&tempNode.valval){
pbf=插入(tempNode.left,val);
bf=setHt(tempNode.left)-setHt(tempNode.right);
如果(bf==2){
如果(pbf==-1){
tempNode.left=rotateLeft(tempNode.left,tempNode.left.right);
}
tempNode=rotateRight(tempNode,tempNode.left);
}
bf=setHt(tempNode.left)-setHt(tempNode.right);
返回高炉;
}
if(tempNode.right!=null&&tempNode.val您的问题是什么?非常好的观点。我更新了问题,使其更为明显。
/* Class node is defined as :
class Node
int val; //Value
int ht; //Height
Node left; //Left child
Node right; //Right child
*/
static Node insert(Node root,int val)
{
Node newNode = new Node();
newNode.val = val;
insertT(root, val);
//inOrder(root);
return root;
}
static int insertT(Node root,int val){
Node newNode = new Node();
Node tempNode = root;
newNode.val = val;
int bf = 0;
int pbf = 0 ;
if (tempNode.left==null && tempNode.val>val){
tempNode.left = newNode;
bf = setHt(tempNode.left) - setHt(tempNode.right);
return bf;
}
if (tempNode.right==null && tempNode.val<val){
tempNode.right = newNode;
bf = setHt(tempNode.left) - setHt(tempNode.right);
return bf;
}
if (tempNode.left!=null && tempNode.val>val){
pbf = insertT(tempNode.left, val);
bf = setHt(tempNode.left) - setHt(tempNode.right);
if (bf==2) {
if (pbf==-1){
tempNode.left = rotateLeft(tempNode.left, tempNode.left.right);
}
tempNode = rotateRight(tempNode,tempNode.left);
}
bf = setHt(tempNode.left) - setHt(tempNode.right);
return bf;
}
if (tempNode.right!=null && tempNode.val<val){
pbf = insertT(tempNode.right, val);
bf = setHt(tempNode.left) - setHt(tempNode.right);
if (bf==-2) {
if (pbf==1){
tempNode.right = rotateRight(tempNode.right, tempNode.right.left);
}
tempNode = rotateLeft(tempNode,tempNode.right);
}
bf = setHt(tempNode.left) - setHt(tempNode.right);
return bf;
}
return bf;
}
static void inOrder(Node root) {
if (root.left!=null) inOrder(root.left);
System.out.print(root.val + ", ");
if (root.right!=null) inOrder(root.right);
}
static int setHt(Node root) {
if(root!=null) {
root.ht = Math.max(setHt(root.left),setHt(root.right)) + 1;
return root.ht;
}
return -1;
}
static Node rotateRight(Node root, Node leftChild) {
Node tempNode = new Node();
tempNode.val = root.val;
tempNode.ht = root.ht;
leftChild.right = tempNode;
root = leftChild;
setHt(root);
//System.out.println("rr");
//inOrder(root);
return root;
}
static Node rotateLeft(Node root, Node rightChild) {
Node tempNode = new Node();
tempNode.val = root.val;
tempNode.ht = root.ht;
rightChild.left = tempNode;
root = rightChild;
setHt(root);
//System.out.println("rl");
//inOrder(root);
return root;
}