其他分享
首页 > 其他分享> > 数据结构--平衡二叉搜索树

数据结构--平衡二叉搜索树

作者:互联网

  1. 上篇介绍了二叉搜索树 这篇介绍下平衡二叉搜索树 是建立在二叉搜索树的基础之上
  2. 当我们依次添加 从小到大的数据的时候 这个时候二叉搜索树会蜕化为链表
  3. 当我们新增或者删除的时候 也可能会退化为链表

有一个平衡的概念 就是左右子树的高度差尽量小

  1. 我们可以在添加或者删除的时候 去旋转节点使得树保持平衡,用尽量少的调转次数使树保持平衡,一棵达到适度平衡的二叉搜索树 我们称之为平衡二叉树
  2. 我们常见的平衡二叉树 有 avl树 和 红黑树 接下来上平衡二叉树的代码
  3. 提供了旋转的方法
public class BBST<E> extends BST<E> {
	public BBST() {
		this(null);
	}
	
	public BBST(Comparator<E> comparator) {
		super(comparator);
	}

	protected void rotateLeft(Node<E> grand) {
		Node<E> parent = grand.right;
		Node<E> child = parent.left;
		grand.right = child;
		parent.left = grand;
		afterRotate(grand, parent, child);
	}
	
	protected void rotateRight(Node<E> grand) {
		Node<E> parent = grand.left;
		Node<E> child = parent.right;
		grand.left = child;
		parent.right = grand;
		afterRotate(grand, parent, child);
	}
	
	protected void afterRotate(Node<E> grand, Node<E> parent, Node<E> child) {
		// 让parent称为子树的根节点
		parent.parent = grand.parent;
		if (grand.isLeftChild()) {
			grand.parent.left = parent;
		} else if (grand.isRightChild()) {
			grand.parent.right = parent;
		} else { // grand是root节点
			root = parent;
		}
		
		// 更新child的parent
		if (child != null) {
			child.parent = grand;
		}
		
		// 更新grand的parent
		grand.parent = parent;
	}
	
	protected void rotate(
			Node<E> r, // 子树的根节点
			Node<E> b, Node<E> c,
			Node<E> d,
			Node<E> e, Node<E> f) {
		// 让d成为这棵子树的根节点
		d.parent = r.parent;
		if (r.isLeftChild()) {
			r.parent.left = d;
		} else if (r.isRightChild()) {
			r.parent.right = d;
		} else {
			root = d;
		}
		
		//b-c
		b.right = c;
		if (c != null) {
			c.parent = b;
		}
		
		// e-f
		f.left = e;
		if (e != null) {
			e.parent = f;
		}
		
		// b-d-f
		d.left = b;
		d.right = f;
		b.parent = d;
		f.parent = d;
	}
}

标签:Node,right,parent,--,child,二叉,grand,数据结构,left
来源: https://blog.csdn.net/tydhenshuai/article/details/118274026