DS博客作业07--查找

1.本周学习总结##

1.思维导图##

2.谈谈你对查找运算的认识及学习体会##

本章主要的知识就是第三部分树表的查找,包含:
①二叉排序树(特点:中序遍历后为有序序列)   在二叉排序树的删除步骤中,为保证树的有序性需要先判断删除结点的左右孩子情况,为空或一方为空,可以通过直接删除或非空子树替代删除:左右孩子不为空,则需要分布考虑
②平衡二叉树 特点平衡因子(结点的左右孩子高度差)≤1, 平衡二叉树的调整方法有:LL,RR,LR,RL调整
还有哈希表的查找:查找成功ASL=探测次数之和/哈希表中已有关键字之和    查找不成功ASL=关键字查找不成功次数之和/哈希表长度

2.PTA实验作业##

2.1.题目1:6-1 二叉搜索树的操作集##

2.1.1设计思路(伪代码)##

BinTree Delete(BinTree BST,ElementType X)
{
    定义tmp树结点
    if树空,直接输出"Not Found“
    else 找到要删除的X对应结点位置
    if X>当前结点 递归调用 Delete(BST->Right,X)
    if X<当前结点 递归调用 Delete(BST->Left,X)
    else if X=当前结点   判断当前结点左右孩子是否为空       
            if 左右孩子不空  
    调用函数FindMin(BST->Right)
    tmp->Data=BST->Data 保存数据
    BST树的右孩子置为结点 保证二叉搜索树的有序性
           else if
                   if左孩子为空, 右孩子置为结点
                   if右孩子为空,右孩子置为结点
    return BST
}

2.1.2代码截图##



2.1.3本题PTA提交列表说明##

Q1:答案错误
A1:在判断树为空后,没有返回NULL,以及函数递归调用结点不正确,修改后改正
Q2:段错误:在删除结点函数中,考虑结点左右孩子不为空的情况,没有定义新的树结点来存储要删除结点
A2:定义新的树结点之后,在函数结束后释放释放结点的所占用的空间

2.2.题目:6-3 二叉搜索树中的最近公共祖先##

2.2.1设计思路(伪代码)##

int LCA(Tree T,int u,int v)
{
    if T 为空,返回 ERROR
    else if   (Find(T,u)且Find(T,v))   结点在树中
    if T->key>u且T->key<v且T->key>v且T->key<u   返回 结点T-key  
            end if
    if T->key=u或T->key=v  返回 结点T->key  
            end if
    if T->key>u或T->key>v 递归函数LCA(T->Left,u,v)   
            end if
    if T->key<u且T->key<v 递归函数LCA(T->Right,u,v)   
            end if
                 end if
    返回ERROR
}

2.2.2代码截图##

2.2.3本题PTA提交列表说明##

Q:部分正确 :测试点2:ERROR重定义  测试点6:两结点重合,但不在树中	  答案错误
A:树空以及结点为找到返回值从-1改为ERROR,结点重合的判断条件只需要判断一个即可,将”&&“改为”||“

2.3.题目:##

2.3.1设计思路(伪代码)##

2.3.2代码截图##

2.3.3本题PTA提交列表说明##

3、阅读代码##

3.1 题目##

给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的##绝对值##不超过1。

3.2 解题思路##

先判断根结点,如果只有一个,则为1;
否则看左子树的深度减去右子树的深度等不等于1;
如果等于1,那么这颗二叉树就是平衡二叉树;
它的深度等于左右子数最大的深度+1;

3.3 代码截图##

3.4 学习体会##

判断平衡二叉树,可以将二叉树拆分为左右子树两部分,通过递归调用函数分别判断左右子树是否也是平衡二叉树,进而判断整棵二叉树是否为平衡二叉树。题目要求平衡因子绝对值小于等于1,这里就需要运用到库函数 abs()给平衡因子加绝对值
原文地址:https://www.cnblogs.com/455j/p/11032707.html