DS博客做業07--查找

1.思惟導圖及學習體會

1思惟導圖

2.談談你對查找運算的認識及學習體會

  • 1. 查找的話,好像要求的代碼不高,主要是得理解,還有老師講的STL容器,包括有map和set,有了這兩種的確方便多了,不用再慢慢建二叉樹還有一些操做好比查找和插入,不過這些老師沒太詳細講出來,就只能靠百度,而後看百度的講解,有些也是難理解,使用容器的確方便多了,不用再本身去建還有一些操做也能夠經過函數來解決。
  • 2.雖然這一章對代碼要求不高,可是涉及的內容更廣更全面了同時也暴露了前面知識的缺漏,好比對樹的掌握對遞歸的掌握還不紮實。並且查找這章除了要求的代碼外更多的是關於平衡樹的調整操做,B樹的刪除增長調整操做等,還有關於各類查找方式對應的查找效率ASL的計算是不一樣的,要搞清楚這些計算首先得先清楚這些查找的原理而後再記憶其ASL的計算方式纔不容易混淆。

2.PTA實驗做業

2.1.題目1:6-3 二叉搜索樹中的最近公共祖先

在一棵樹T中兩個結點u和v的最近公共祖先(LCA),是樹中以u和v爲其後代的深度最大的那個結點。現給定某二叉搜索樹(BST)中任意兩個結點,要求你找出它們的最近公共祖先。

2.1.1設計思路(僞代碼)

int find(Tree T, int x)
{
    if  T爲空 then  return 0
        end if 
    if  x 等於 關鍵字 then
        return 1
    else if  x 大於 關鍵字
        遞歸函數find(T->Right, x)
    else
        遞歸函數find(T->Left, x)
        end if 
}

int LCA(Tree T, int u, int v)
{
    if  T 爲空 then  返回ERROR
        end if 
    if  find(T, u) 返回0或者find(T, v)返回0  then     返回ERROR
        end if 
    if T->Key 大於等於u而且T->Key小於v或者 T->Key 小於等於 u而且T->Key 大於等於 v then 
        返回 T->Key
       if (u 大於 T->Key) then      //使用遞歸找下一個結點 
        遞歸函數LCA(T->Right, u, v);
    else if u 小於 T->Key   
        遞歸函數LCA(T->Left, u, v)
   end if
}

2.1.2代碼截圖

2.1.3本題PTA提交列表說明。

  • Q1:一開始得分是比較低的,是我思路錯了,而後寫出來的只有空樹以及樣例對的
  • A1:我覺得是想利用指針來知道地址,每一個節點存父母的地址,而後寫着寫着太難了,還恰好打出了跟樣例的結果同樣,交上去都是錯的
  • Q2:老師在課上講了下如何寫了,也就是利用到了二叉搜索樹的性質來解決
  • A2:左子樹的結點的值都小於根結點的值,右子樹的結點的值都大於根結點的值,判斷給出的倆個值是否是一個大於一個小於,若是是則這時的根結點就是咱們要找的,這樣子比原本的我作法容易多了。

2.2.題目1:7-1 QQ賬戶的申請與登錄

實現QQ新賬戶申請和老賬戶登錄的簡化版功能。最大挑戰是:聽說如今的QQ號碼已經有10位數了。

2.2.1設計思路(僞代碼)

頭文件:
#include <bits/stdc++.h>
#include<iostream>
#include<map>
#include<string>
int main()
    定義整數n,m;
    定義字符串 a,b,c;
    set<string> match;                //初始化set容器match 存帳號 
    map<string,string> iter;         //存帳號對應的密碼 
    輸入n;
    while  n大於0且n自減 do
        輸入 a、b、c;
        if a等於L then 
            if match.find(b)等於match.end() then               ///調用find函數 已有帳號中沒找到該帳號 
                輸出ERROR: Not Exist
            else
                if iter[b]不等於c
                輸出ERROR: Wrong PW
                else
                輸出Login: OK
                end if 
        else if a等於N 

            if match.find(b)不等於match.end() then 
               輸出ERROR: Exist
           else
                輸出New: OK
                iter[b]=c;
                match.insert(b);
           end if
       end if
      end while

2.2.2代碼截圖


2.2.3本題PTA提交列表說明。

  • Q1:剛開始寫的時候定義了個數組來打算存放QQ號和密碼
  • A1:而後發現交上去發現有個測試點事有關於上下界的問題,而後我就想是否是設置的太小了,修改了數組大小再交上去過了那個測試點,還有字符數組末尾爲\0得記住
  • Q2:後面就不會再改了,看了其餘人代碼,才知道要用容器更快,用了map容器處理帳號密碼的時候,就能夠更快配對。
  • A2:在查找能夠用find()函數,返回的是一個迭代器,若該下標不存在,返還end()。查找還能經過直接訪問下標,相似數組的形式,可是若不存在,會插入數據,會直接插入。

2.3.題目1:6-1 二叉搜索樹的操做集

本題要求實現給定二叉搜索樹的5種經常使用操做。

2.3.1設計思路(僞代碼)

Position FindMin(BinTree BST)

    if BST 不爲空 then 
        if  BST的左孩子不空 then 
            遞歸調用函數 FindMin(BST->Left);
        
        else 
            返回BST; 
    end if 
    


Position FindMax(BinTree BST)

    if  BST 不爲空  then
        if BST右孩子不爲空 then 
            while BST右孩子不爲空
                BST = BST->Right;
            end while          
        end if 
    end if 
        返回 BST;
    


BinTree Insert(BinTree BST, ElementType X)

    if  BST爲空 then  
        定義BinTre類型結點p;
        申請動態空間;
        X存入p的數據域;
        p的左右孩子初始化爲空; 
        BST = p;
    else if X < BST->Data then
        BST->Left = Insert(BST->Left, X);
    else if X < BST->Data then
        BST->Right = Insert(BST->Right, X); //利用遞歸來進行數據的插入 
    end if
    返回 BST;

BinTree Delete(BinTree BST, ElementType X)

    if BST 爲空 then
        輸出Not Found
    else 
        if  X < BST->Data then
            BST->Left = Delete(BST->Left, X);
        else if  X > BST->Data then 
            BST->Right = Delete(BST->Right, X);
        else if X = BST->Data
            if  BST的左右孩子都不爲空 then
                新建BinTree類型結點p;
                p = FindMin(BST->Right);
                BST->Data = p->Data;
                BST->Right = Delete(BST->Right, BST->Data);
            
            else 
                if BST的左孩子爲空 then 
        BST = BST->Right;
                else if BST右孩子爲空 then 
        BST = BST->Left;
            end if 
        end if
    end if
    返回 BST


Position Find(BinTree BST, ElementType X)

    if  BST爲空 then  
        返回空值; 
    if BST->Data == X then
        返回BST結點;
    else if X < BST->Data then 
        利用遞歸找下一個左孩子結點; 
    else if (X > BST->Data)
        利用遞歸找下一個左孩子結點; 
    返回BST

2.3.2代碼截圖


2.3.3本題PTA提交列表說明。

  • Q1:除了刪除函數那一部分難寫外,其餘函數都還能夠,就是找最大值和找最小值的函數中有錯誤,在提交代碼後發現找最大值的函數FindMax出現錯誤
  • A1:原本我也是寫成遞歸形式來在右子樹中找最右下角的那個數即爲最大值,而後交上去就是錯的,後來才改寫成while語句,當時沒判斷後已經到空了仍進行操做吧
  • Q2:刪除函數是真的很差寫,思路知道,但是代碼上很差寫,仍是乖乖去百度了下,麻煩的地方就在於要上刪除的結點有左孩子也有右孩子
  • A2:在刪除這個結點同時,還要從他的右孩子中找一個最大的來放到刪除的這個位置,原本我還覺得要調用的是FINDMAX函數,而後就是這裏出錯了,應該再調用刪除函數

3閱讀代碼

3.1 題目:二叉搜索樹的結構

二叉搜索樹或者是一棵空樹,或者是具備下列性質的二叉樹: 若它的左子樹不空,則左子樹上全部結點的值均小於它的根結點的值;若它的右子樹不空,則右子樹上全部結點的值均大於它的根結點的值;它的左、右子樹也分別爲二叉搜索樹。(摘自百度百科)

給定一系列互不相等的整數,將它們順次插入一棵初始爲空的二叉搜索樹,而後對結果樹的結構進行描述。你須要能判斷給定的描述是否正確。例如將{ 2 4 1 3 0 }插入後,獲得一棵二叉搜索樹,則陳述句如「2是樹的根」、「1和4是兄弟結點」、「3和0在同一層上」(指自頂向下的深度相同)、「2是4的雙親結點」、「3是4的左孩子」都是正確的;而「4是2的左孩子」、「1和3是兄弟結點」都是不正確的。

3.2 解題思路

首先建樹,讀查詢的字符串輸入是個問題,如何去把每條查詢的節點編號提取出來是解決的關鍵
不要每一條查詢都去遍歷樹,能夠先把節點之間的關係:是否在同一層、左孩子、右孩子、祖先節點等保存在map中後邊直接根據map判斷
還要就是可能查詢的節點編號不在樹上

3.3 代碼截圖





3.4 學習體會

本身來寫確定寫不出來,若是是我來寫的話建樹過程當中記錄每一個點高度,以及每一個點指向的結點,這樣子在後面查詢的時候會方便點。對map函數的應用就沒怎麼太大的理解 ,這個做者對於map容器理解的很好,我不會像用數組同樣利用下標來操做,不過這樣也更體現map的快速查找功能。以前百度講解map容器時候有說過可使用下標,可是若是map下標運算符[]運用不得當,也會形成意想不到的問題。
相關文章
相關標籤/搜索