在一棵樹T中兩個結點u和v的最近公共祖先(LCA),是樹中以u和v爲其後代的深度最大的那個結點。現給定某二叉搜索樹(BST)中任意兩個結點,要求你找出它們的最近公共祖先。
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 }
實現QQ新賬戶申請和老賬戶登錄的簡化版功能。最大挑戰是:聽說如今的QQ號碼已經有10位數了。
頭文件: #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
本題要求實現給定二叉搜索樹的5種經常使用操做。
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 4 1 3 0 }插入後,獲得一棵二叉搜索樹,則陳述句如「2是樹的根」、「1和4是兄弟結點」、「3和0在同一層上」(指自頂向下的深度相同)、「2是4的雙親結點」、「3是4的左孩子」都是正確的;而「4是2的左孩子」、「1和3是兄弟結點」都是不正確的。
首先建樹,讀查詢的字符串輸入是個問題,如何去把每條查詢的節點編號提取出來是解決的關鍵 不要每一條查詢都去遍歷樹,能夠先把節點之間的關係:是否在同一層、左孩子、右孩子、祖先節點等保存在map中後邊直接根據map判斷 還要就是可能查詢的節點編號不在樹上
本身來寫確定寫不出來,若是是我來寫的話建樹過程當中記錄每一個點高度,以及每一個點指向的結點,這樣子在後面查詢的時候會方便點。對map函數的應用就沒怎麼太大的理解 ,這個做者對於map容器理解的很好,我不會像用數組同樣利用下標來操做,不過這樣也更體現map的快速查找功能。以前百度講解map容器時候有說過可使用下標,可是若是map下標運算符[]運用不得當,也會形成意想不到的問題。