算法和数据结构(6)树2

二叉树的查找和搜索

  1. 定义:二叉搜索树(binary search tree),利用二分法 的思想定义的树,满足以下性质
    1. 非空左子树的所有健值小于其根节点的键值;
    2. 非空右子树的所有健值大于其根节点的键值
    3. 所有左右子树都是二叉搜索树
//伪代码如下
public SearchTree find(int target,SearchTree st){
  if(st==null){
    return null;//查找失败
  }
  if(st.data<target){
    return find(target,st.right);
  }
  else if(st.data>target){
    return find(target,st.left);
  }else if return st;
  
}

上述的递归又称尾递归,尾递归即程序要返回时候进行的递归;

尾递归都可以该做循环,执行的效率更高;

二叉查找树的插入

//伪代码如下
public SearchTree insert(int data , SearchTree st){
  if(st == null){
    st = new SearchTree();
    st.data =data;
  }else if (st.data >data){
    insert(data,st.left);
  }else insert(data,st.right);
  
  return st;
}

题目:给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。


3,2,4,1 和 3,2,1,4 true
3,2,4,1和3,1,4,2 false

分为建树和不建树两种策略

建树策略:
构建一个颗树,判断构建的树和另一个序列是否能构成同一颗树;
构建的树和另一个序列对比:
判断该序列在查找过程中是否遇见了没有被查找过的结点;有输出为false;

    public boolean compareTree(ArrayList<Integer> arr1,ArrayList<Integer> arr2){
        SearchTree st1 = new SearchTree(arr1);
        for (Integer target : arr1) {
            if (!check(st1,target)) return false;
        }
        return true;
    }

    public boolean check(SearchTree st1,int target){
        if (st1.flag==1){
            if (st1.data>target){
                check(st1.left,target);
            }else if (st1.data<target){
                check(st1.right,target);
            }else return false;
        }else if (st1.data==target) {
            st1.flag=1;
            return true;
        }
        return false;
    }
二叉查找树的删除

二叉查找树的删除分为3种情况讨论

  1. 无子结点,直接删除
  2. 只有左子结点,或者只有右子结点,删除后,指向其子结点;
  3. 左右子结点都有,找左结点最大值,作为该子树的根,或者找右子树的最小值,作为该子树的根

代码如下

//伪代码如下
public SearchTree delete(int target , SearchTree st){
	if(st == null){
    throw new Exception("无删除的数据");
  }else if(st.data>target)
    delete(target,st.left);
  else if(st.data<target)
    delete(target,st.right);
  else{
    if(st.right!=null && st.left!=null){
      SearchTree temp = findMin(st.right);
      st.data = temp.data;
      delete(temp.data,st.right);
    }else {
      if(st.right == null){
        st = st.left;
      }else st = st.right;
    }
  }
  return st;
}

public SearchTree findMin(SearchTree st){
  while (st.left!=null){
    st=st.left;
  }
  return st;
}

平衡二叉树

平均查找长度(ASL):即平均查找长度,在查找运算中,由于所费时间在关键字的比较上,所以把平均需要和待查找值比较的关键字次数称为平均查找长度。
在这里插入图片描述

左右子树越均匀,越平衡,平均查找长度就越小

平衡因子 balance factor:BF(T)=h(L)-h®; h(L) ,h®指T的左右子树的高度;

定义:空树 或者 树中任一结点的BF(T)的绝对值小于1;

给定n个结点的平衡树的最大高度为log2n

平衡二叉树的调整

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值