数据结构之平衡二叉树

树结构简介
树结构本身是一种天然的组织结构,将数据使用树结构存储后,会大幅高效率。

在这里插入图片描述
什么是二叉树

  • 和链表一样,动态数据结构
class Node{
	E e;
	Node left;	//左孩子
	Node right;	//右孩子
}

多叉树(多个子结点)

  • 二叉树具有唯一根节点
  • 二叉树中每个结点最多有两个孩子,没有孩子的结点称之为叶子结点
  • 二叉树中每个结点最多有一个父亲结点,根节点没有父亲结点
  • 二叉树具有天然递归结构,每个结点的左子树或右子树,也是一个二叉树

平衡二叉树

平衡二叉搜索树(Self-balancing binary search
tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一
棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树

在这里插入图片描述

  • 二叉树不一定是“满”的

在这里插入图片描述

在这里插入图片描述

  • 极端的左或右都是二叉树,只不过退化成了线性表,这种情况称之为不平衡二叉树

在这里插入图片描述

  • 一个结点也叫二叉树,无非左右孩子都为null,null 空也是二叉树
    在这里插入图片描述
  • 什么是完全二叉树,什么是满二叉树,二叉树中层数与结点个数的关系?

完全二叉树:如果一棵具有n个结点的深度为k的二叉树,它的每一个结点都与深度为k的满二叉树中编号为1~n的结点一一对应,这棵二叉树称为完全二叉树。

满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树。

每一层最多几个节点 2^(h-1)

如果用动态数组存一个深度为h的二叉树 最多需要 2^h-1

- 什么是二分搜索树(Binary Search Tree)

  • 二分搜索树是二叉树
  • 对于二分搜索树的每个结点的值而言

-大于其左子树的所有结点的值-
-小于其右子树的所有结点的值-
在这里插入图片描述

  • 其每一个子树也是二分搜索树

在这里插入图片描述

在这里插入图片描述
二分搜索树中所存储的元素必须具有可比较性!实现Comparable接口
不包含重复元素
.
.
.

二分搜索树的实现
1.定义类

public class BinarySearchTree<E extends Comparable<E>>

2. 定义结点(内部类)

private class Node{
	public E e; 
	public Node left;
	public Node right; 
	public Node(E e) {
		this.e=e; 
		left=null;
 		right=null;
	 }
}

3. 定义成员变量

private Node root;
private int size;

4. 定义构造函数

public BinarySearchTree(){ 
	root=null;
	size=0;
}

5. 获取树中元素的个数

public int size(){
	return size;
}

6. 判断树是否为空

public boolean isEmpty(){
	return size==0;
}

7. 添加元素

public void add(E e){
	root=add(root,e);
}
//以node为当前树的根节点,添加元素e并返回该树的根 此处递归实现 如何循环实现?
private Node add(Node node,E e){
  if(node==null){
   size++;
   return new Node(e);
  }
  if(e.compareTo(node.e)>0){
   node.right=add(node.right,e);
  }else if(e.compareTo(node.e)<0){
   node.left=add(node.left, e);
  }
  return node;
 }

8.查找元素e是否存在于树中

   public boolean contains(E e){
 	 return contains(root,e); 
  }
  private boolean contains(Node node,E e){
 if(node==null){
	return false;
  }
  if(e.compareTo(node.e)>0){
	 return contains(node.left,e);
  }else if(e.compareTo(node.e)<0){
  	 return contains(node.right,e);
  }else{
 	 return true;
  }
 }

9.中序遍历

public void inOrder(){
  ArrayList<E> list=new ArrayList<E>();
  inOrder(root,list);
  System.out.println(list);
 }
 //中序遍历
 private void inOrder(BinarySearchTree<E>.Node node, ArrayList<E> list) {
  if(node==null){
   return;
  }
  inOrder(node.left,list);
  list.add(node.e);
  inOrder(node.right, list);
 }

10.层序遍历/广度优先遍历

  public void levelOrder(){
   ArrayList<E> list=new ArrayList<E>();
   //用辅助队列实现层序遍历
   Queue<Node> queue=new LinkedList<Node>();
   queue.add(root);
   while(!queue.isEmpty()){
    Node cur=queue.poll();
    list.add(cur.e);
    if(cur.left!=null){
     queue.add(cur.left);
    }
    if(cur.right!=null){
     queue.add(cur.right);
    }
   }
   System.out.println(list);
  }
  @Override
  public String toString() {
   StringBuilder sb=new StringBuilder();
   generateBSTString(root,0,sb);
   return sb.toString();
  }
  private void generateBSTString(BinarySearchTree<E>.Node node, int level,
    StringBuilder sb) {
   if(node==null){
    sb.append(generateDepthString(level)+"null\n");
    return;
   }
   generateBSTString(node.left, level+1, sb);
   sb.append(generateDepthString(level)+node.e+"\n");
   generateBSTString(node.right, level+1, sb);
  }
  private String generateDepthString(int level) {
   StringBuilder sb=new StringBuilder();
   for(int i=0;i<level;i++){
    sb.append("  ");
   }
   return sb.toString();
  }

11.获取最小值

public E minmum(){
   if(size()==0){
    throw new IllegalArgumentException("Tree is empty!");
   }
   return minmun(root).e;
  }
  //以Node为根节点,查找该数中的最小值
  private Node minmun(Node node){
   if(node.left==null){
    return node;
   }
   return minmun(node.left);
  }

12.获取最大值

public E maxmun(){
   if(size()==0){
    throw new IllegalArgumentException("Tree is empty!");
   }
   return maxmum(root).e;
  }
  private Node maxmum(BinarySearchTree<E>.Node node) {
   if(node.right==null){
    return node;
   }
   return maxmum(node.right);
  }

13.删除最小值

public E removeMin(){
   E e=minmum();
   root=removeMin(root);
   return e;
  }
  //以node为根节点的二分搜索树,在删除最小值之后并返回新树的根
  private BinarySearchTree<E>.Node removeMin(
    BinarySearchTree<E>.Node node) {
   if(node.left==null){
    Node rightNode=node.right;
    node.right=null;
    size--;
    return rightNode;
   }
   node.left=removeMin(node.left);
   return node;
  }

14.删除最大值

public E removeMax(){
   E e=maxmun();
   root=removeMax(root);
   return e;
  }
  private BinarySearchTree<E>.Node removeMax(
    BinarySearchTree<E>.Node node) {
   if(node.right==null){
    Node leftNode=node.left;
    node.left=null;
    size--;
    return leftNode;
   }
   node.right=removeMax(node.right);
   return node;
  }

15.删除任意元素

public void remove(E e){
   root=remove(root,e);
  }
  //以node为根,删除指定元素e之后,返回新树的根
  private Node remove(Node node,E e){
   if(node==null){
    return null;
   }
   if(e.compareTo(node.e)>0){
    node.right=remove(node.right, e);
    return node;
   }else if(e.compareTo(node.e)<0){
    node.left=remove(node.left, e);
    return node;
   }else{
    if(node.left==null){
     Node rightNode=node.right;
     node.right=null;
     size--;
     return rightNode;
    }
    if(node.right==null){
     Node leftNode=node.left;
     node.left=null;
     size--;
     return leftNode;
    }
    Node successor=minmun(node.right);
    successor.right=removeMin(node.right);
    successor.left=node.left;
    node.left=node.right=null;
    return successor;
   }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值