分析:
1.二叉樹是 二叉搜尋樹(左節點小於父節點,右節點大於父節點)
思路:從根節點開始,如果當前節點比兩個節點都大,則在左子樹;如比當前節點都小,則在右子樹
以此類推,直到找到乙個節點的大小介於兩節點之間,則該節點就是最近的公共父節點
2.非二叉搜尋樹,但有指向父節點的指標域
思路:分別從兩個節點開始得到其返回根節點的路徑(鍊錶),在這兩條路徑中找到第乙個公共節點
3.普通二叉樹
思路1. 如果在節點的左邊包含兩個目標節點,則進入左節點;如果在節點的右邊包含兩個目標節點,則進入右節點;
退出條件:如果兩目標節點不在該節點的同一側,則該節點就是要找的
思路2. 思路1比較慢;我們可以分別得到根節點到兩目標節點的路徑,則問題轉化為鍊錶的最後乙個公共節點
**實現:
typedef struct btnode
;bool getnodepath(btnode* proot, btnode* pnode, listpath) //得到路徑
if (!found)
path.pop_back();
return found;
}btnode* getlastcommentnode(listpath1, listpath2) //比較兩個路徑
return pnext;
}btnode* getlastcommonparent(btnode* proot, btnode* pnode1, btnode* pnode2) //呼叫上述兩個得到結果
二叉樹中兩節點的最低公共祖先
二叉樹中兩節點的最低公共祖先 要求如下 給定乙個頭節點head 和另外兩個節點 a b 返回 a 和 b 的最低公共祖先 和思路如下 package beginner.tree 給定乙個頭節點head 和另外兩個節點 a b 返回 a 和 b 的最低公共祖先 auther 蘇察哈爾丶燦 date 2...
二叉樹 查詢兩個任意節點的最近祖先
很久沒有用過二叉樹了,最近由於需要用到了,發現很多知識需要鞏固了,中間涉及到乙個演算法就是找任意兩個節點的最近祖先。通過本人回顧和演算,最終提出了下面乙個方法,網上也有很多其他的方式實現,再次僅對自己好幾個小時的工作作個記錄和積累吧!程式是用c語言寫的,個人覺得如果用c 實現會更加方便。首先是資料結...
二叉樹 最近公共父節點
給定二叉樹中的任意兩點,求解該兩點的最近公共父節點。程式大致分為遞迴和非遞迴兩種方式,下面我們先來認識非遞迴的方式。非遞迴程式總體的思路 用一種常見高效的資料結構來記錄下二叉樹中的結構關係,由於是找父節點,所以要用子節點來查詢父節點,我們這裡用到的是hashmap來進行樹形關係的儲存。接下來就是先列...