平衡二叉树的实现

首先平衡二叉树的原理是:一个一个节点的向二叉树中添加,如果添加的节点大于其父节点则添加到右子树中,如果小于其父节点则放在左子树中。且左右子树高度的绝对值不大于一。如果左右子树高度出现不平衡,需要进行调整,会出现的情况有,左左型,左右型,右右型,右左型。

下面是代码实现:
添加节点并平衡二叉树

	public Node insertNode(int element)
	{
		Node newnode = super.insertNode(element);
		relance((AVLnode)newnode);
		return newnode;
	}

控制树的高度

protected void relance(AVLnode node)
	{
		int leftheigh = (AVLnode)node.left ==null?-1:((AVLnode)node.left).height;
		int rightheight = (AVLnode)node.right==null?-1 :((AVLnode)node.right).height;
		int relanceheight = rightheight - leftheigh;
		while(node!=null)
		{
			Node parent = node.parent;
			if(relanceheight == 2)
			{
				if(node.right.right!=null)
				{
					node = (AVLnode) valrotateleft(node);
					break;
				}
				else {
					node = (AVLnode) doublerotateleftright(node);
					break;
				}
				
			}else if(relanceheight == -2)
			{
				if(node.left.left != null)
				{
					node = (AVLnode) valrotateright(node);
					break;
				}
				else {
					node = (AVLnode) doublerotaterightleft(node);
					break;
				}
			}
			else {
				updateheight(node);
			}
			node = (AVLnode) parent;
		}
		
		
	}
左旋节点

```java
protected Node valrotateleft(Node node) {
		Node temp = super.rotateleft(node);
		updateheight((AVLnode)temp.left );
		updateheight((AVLnode)temp);
		return temp;
	
		
	}

右旋节点

	protected Node valrotateright(Node node)
	{
		Node tempNode = super.rotateright(node);
		updateheight((AVLnode)tempNode.right);
		updateheight((AVLnode)tempNode);
		return tempNode;
		
	}

取右子节点,先把它旋转到右侧,在把根节点节点旋转到左侧

protected Node doublerotaterightleft(Node node)
	{
		node.right = valrotateright(node.right);
		return valrotateleft(node);
	}

取左子节点,先把它旋转到左侧,在把根节点节点旋转到右侧

protected Node doublerotateleftright(Node node)
	{
		node.left = valrotateleft(node.left);
		return valrotateright(node);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值