二叉樹:距離最近的共同祖先
問題描述 :
-
目的:使用C++模板設計二叉樹的抽象資料型別(ADT)。並在此基礎上,使用二叉樹ADT的基本操作,設計並實現簡單應用的演算法設計。
-
內容:(1)請參照連結串列的ADT模板,設計二叉樹的抽象資料型別。(由於該環境目前僅支援單檔案的編譯,故將所有內容都集中在一個原始檔內。在實際的設計中,推薦將抽象類及對應的派生類分別放在單獨的標頭檔案中。參考教材、課件,以及網盤中的連結串列ADT原型檔案,自行設計二叉樹的ADT。)
-
注意:二叉樹ADT的基本操作的演算法設計很多要用到遞迴的程式設計方法。
-
(2)ADT的簡單應用:使用該ADT設計並實現若干應用二叉樹的演算法設計。
-
應用:要求設計一個演算法,查詢距離二叉樹中2個結點最近的共同祖先。二叉樹的儲存結構的建立參見二叉樹應用1。
-
注意:x、y都是屬於該二叉樹的結點。
參考函式原型:
//查詢距離二叉樹中2個結點最近的共同祖先 (使用者函式)
template<class ElemType>
BinaryTreeNode<ElemType> * FindNearAncient( BinaryTree<ElemType> &T, ElemType &x, ElemType &y );
輔助函式:
//查詢從根結點到元素值為x的結點的路徑 (成員函式,參見基本操作18)
template<class ElemType> //Q為存放路徑的順序佇列
void BinaryTree<ElemType>::FindPath( ElemType &x, SqQueue<BinaryTreeNode<ElemType> *> &Q );
輸入說明 :
第一行:表示無孩子或指標為空的特殊分隔符
第二行:二叉樹的先序序列(結點元素之間以空格分隔)
第三行:元素值x
第四行:元素值y
輸出說明 :
第一行:元素值(共同祖先)
如x、y中有根結點,則輸出NULL
輸入範例 :
#
A B # C D # # E # # F # G # H # #
B
D
輸出範例 :
A
思路分析
- 將問題轉換為找兩個字串的公共子串的最後一個元素
實現偽碼
BinaryTreeNode * FindNearAncient( BinaryTree T
, ElemType x, ElemType y ){
//樹為空,就退出
if(T.BinaryTreeisEmpty()) return NULL;
//建造兩個佇列用來儲存二者的路徑
SqQueue<BinaryTreeNode*> xQueue,yQueue;
//生成二者的路徑的
T.FindPath(x,xQueue);
T.FindPath(y,yQueue);
//遍歷兩個佇列,找對最後一個公共字首
BinaryTreeNode *xNode,*yNode;
xQueue.deQueue(xNode);
yQueue.deQueue(yNode);
//遍歷兩個佇列
while(xNode->getData() != yNode->getData()){
//首先佇列不是等長的,長的先出
if(xQueue.getQueueNums() > yQueue.getQueueNums()){
xQueue.deQueue(xNode);
}
else if(xQueue.getQueueNums() < yQueue.getQueueNums()){
yQueue.deQueue(yNode);
}else{
xQueue.deQueue(xNode);
yQueue.deQueue(yNode);
}
}
//裡面還有一個節點可以出隊
if(xQueue.getQueueNums() >= 1)
{
xQueue.deQueue(xNode);
return xNode;
}else{
return NULL;
}
}
事故現場
第一次提交
- 我試了很多,但離奇的是,居然都通過了,所以,毫不猶豫地買了樣例
- 半截題目沒有看清,行吧,認了。
分析總結
- 題目沒有申請,所以,還剩很多,用盡洪荒之力,接著寫吧
如果不妥,請在評論區留言,或者加我的扣扣一起討論學習,651378276
相關文章
- 二叉樹的最近公共祖先二叉樹
- 二叉搜尋樹和二叉樹的最近公共祖先二叉樹
- # 劍指 Offer 68 - II. 二叉樹的最近公共祖先二叉樹
- 二叉樹最大距離(直徑)二叉樹
- leetcode 235. 二叉搜尋樹的最近公共祖先LeetCode
- 二叉樹中最遠的兩個結點的距離二叉樹
- (117)235. 二叉搜尋樹的最近公共祖先(leetcode)LeetCode
- 最近公共祖先
- 【leetcode 簡單】 第六十八題 二叉搜尋樹的最近公共祖先LeetCode
- 求二叉樹的給定兩個結點之間的距離二叉樹
- Day21 | 530.二叉搜尋樹的最小絕對差、501.二叉搜尋樹中的眾數 、236. 二叉樹的最近公共祖先二叉樹
- 二叉樹中相距最遠的兩個節點之間的距離二叉樹
- 二叉樹中兩個節點的最低公共祖先二叉樹
- Java二叉樹排序及任意兩點個節點間的最大距離Java二叉樹排序
- 二叉樹任意兩個節點間的最大距離(Java,LeetCode 543二叉樹的直徑 遞迴)二叉樹JavaLeetCode遞迴
- 樹上問題/簡單演算法 LCA【最近公共祖先】演算法
- lc235.二叉搜尋樹的最近公共祖先【①分別得到祖先序列,然後比較;②***同時查詢,找出分岔結點】
- 程式碼隨想錄day18 || 530 二叉搜尋樹最小差,501 二叉搜尋樹眾數,236 二叉搜尋樹最近公共祖先
- Google S2 中的四叉樹求 LCA 最近公共祖先Go
- POJ 1330 LCA最近公共祖先 離線tarjan演算法演算法
- LeetCode——最近公共祖先LeetCode
- 236、二叉樹的最近公共祖先 | 演算法(leetcode,附思維導圖 + 全部解法)300題二叉樹演算法LeetCode
- LeetCode 834 樹中距離之和LeetCode
- 平面最近點對 & 最小周長三角形 & 曼哈頓距離最近
- Git 中的演算法-最近公共祖先Git演算法
- 祖先樹統計
- LCA最近公共祖先 線上演算法和離線演算法 模板演算法
- 程式碼隨想錄演算法訓練營第22天 |二叉樹part07:235. 二叉搜尋樹的最近公共祖先、701.二叉搜尋樹中的插入操作、450.刪除二叉搜尋樹中的節點演算法二叉樹
- 程式碼隨想錄演算法訓練營day18 |530.二叉搜尋樹的最小絕對差 501.二叉搜尋樹中的眾數 236. 二叉樹的最近公共祖先演算法二叉樹
- 程式碼隨想錄演算法訓練營第18天| 530.二叉搜尋樹的最小絕對差, 501.二叉搜尋樹中的眾數 , 236. 二叉樹的最近公共祖先演算法二叉樹
- leetcode-834. 樹中距離之和LeetCode
- 建立二叉樹:層次遍歷--樹的寬度高度,後序遍歷--祖先節點二叉樹
- JavaScript 元素距離視窗頂部的距離JavaScript
- 程式碼隨想錄演算法訓練營第19天|235. 二叉搜尋樹的最近公共祖先 ,701.二叉搜尋樹中的插入操作,450.刪除二叉搜尋樹中的節點演算法
- 樹上公共祖先(LCA)
- LeetCode 236. 二叉樹的最近公共祖先 極限效能演算法 比LeetCode 99%還快50倍LeetCode二叉樹演算法
- JavaScript獲取元素距離文件頂部的距離JavaScript
- 程式碼隨想錄演算法訓練營day22 | leetcode 235. 二叉搜尋樹的最近公共祖先、701. 二叉搜尋樹中的插入操作、450. 刪除二叉搜尋樹中的節點演算法LeetCode