二叉树的查找和搜索
- 定义:二叉搜索树(binary search tree),利用二分法 的思想定义的树,满足以下性质
- 非空左子树的所有健值小于其根节点的键值;
- 非空右子树的所有健值大于其根节点的键值
- 所有左右子树都是二叉搜索树
//伪代码如下
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种情况讨论
- 无子结点,直接删除
- 只有左子结点,或者只有右子结点,删除后,指向其子结点;
- 左右子结点都有,找左结点最大值,作为该子树的根,或者找右子树的最小值,作为该子树的根
代码如下
//伪代码如下
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
平衡二叉树的调整