解决的方案:
1.1动态数组:平均时间复杂度为O(n);
1.2维护一个有序的动态数组,使用二分搜索最坏时间复杂度为O(log n),添加与删除的时间复杂度为O(n);
1.3使用二分搜索树,最坏的时间复杂度为O(log n)
2.1特点:任意一个节点值小于所有右子树节点的值,大于所有左子树节点的值
存储的元素必须具有比较性(如果是自定义类型,需要指定比较的方式)
2.2优点:可以大大提高搜索数据的效率
int size();//元素数量
boolean isEmpty(); //是否为空
void clear(); //清空所有元素
void add(); //添加元素
void delete();//删除元素
void contain();//是否包含元素
注意:此处的二叉树并未使用索引;
原因:因为二叉搜索树添加元素的顺序与节点的位置无关,并不适合用索引
首先判断根节点是否为空,如果不为空,先添加根节点;
根节点不为空时添加元素,首先要找到添加位置的根节点,并且判断添加元素与根节点的大小,创建新节点,如果大于,则添加到右子树的节点上;反之则添加到左子树的节点上;
size++;
- public void add(int element){
- // elementIsnull(element);
- if(root==null){
- root=new Node(element,null);
- size++;
- return;
- }
- Node node=root;
- Node newParent=root;//记录父亲节点
- int state=0;//记录一下元素与结点的比较结果;0代表元素大于节点值。1代表相反结果
- while (node!=null){
- newParent=node;
- if(element>node.element){
- node=node.right;
- state=0;
- }else if(element
- node=node.left;
- state=1;
- }else {
- node.element=element;
- return;
- }
- }
- Node newNode=new Node(element,newParent);
- if(state==0){
- newParent.right=newNode;
- }else {
- newParent.left=newNode;
- }
- size++;
- }
5.二叉树的前序遍历 (注意所有二叉树)
遍历顺序:遍历根节点——前序遍历左子树节点——前序遍历右子树节点(递归实现)
- public void preorderTraversal(Node root){
- if(root==null){
- return;
- }
- // 首先遍历根节点
- System.out.println(root.element);
- // 其次前序遍历左子树
- preorderTraversal(root.left);
- // 最后前序遍历右子树
- preorderTraversal(root.right);
- }
遍历结果:
