給定乙個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。
例如,給定如下二叉樹: root = [3,5,1,6,2,0,8,null,null,7,4]
分三種情況:
如果這兩個節點其中乙個是根節點,直接返回根節點
如果乙個結點在左子樹,另乙個在右子樹,直接返回根節點
如果兩個都在左子樹或者都在右子樹上,直接使用遞迴返回最近公共祖先。
class solution
if(r==t)
if(search(r.left,t))
if(search(r.right,t))
return false;
}public treenode lowestcommonancestor(treenode root, treenode p, treenode q) //這兩個節點至少乙個是根節點
boolean ph=search(root.left,p);
boolean pf=search(root.right,q);
boolean phi=search(root.right,p);
boolean pfi=search(root.left,q);
if(ph&&pf||phi&&pfi) // 乙個在左子樹,乙個在右子樹
if(ph&&pfi)
return lowestcommonancestor(root.right,p,q); //兩個都在右子樹
}}
這個演算法時間複雜度較高,相對節省空間。 求兩個節點的最近公共祖先節點
原文 分三種情況 1 搜尋二叉樹,根據搜尋二叉樹的性質,左子樹的所有節點比根節點小,右子樹的所有節點比跟節點大。如果兩個節點都比根節點小,則遞迴左子樹 如果兩個節點都比跟節點大,則遞迴右子樹 否則,兩個節點乙個在左子樹,乙個在右子樹,則當前節點就是最近公共祖先節點。2 二叉樹有指向父節點的指標。問題...
求樹中兩個節點的最近公共祖先(版本2)
1.求樹中兩個節點的最近公共祖先 版本2 我們來看 這個問題 的 第二種解析思路 在第一種思路中,我們將 這個題意理解為,這棵樹是一顆二叉搜尋樹.在第二種思路中,我們將 這棵樹,理解為一顆普通的樹,或許它都不是二叉樹,不過這不重要 不過為了方便測試,我們將用結點中含有指向父節點指標的二叉樹進行測試 ...
找兩個鍊錶的公共節點
首先考慮兩個鍊錶無環的情況。將鍊錶a的尾節點指向頭節點從而形成環。用快慢指標遍歷鍊錶b,乙個一次移動2單位,另乙個移動1單位。如果不相遇則不存在公共節點。如果相遇,則讓其中乙個指標指向b,兩個指標以1單位 次的速度移動,直到相遇。相遇時指向的節點就是公共節點的起始。最後記得將a的尾節點恢復。如下。其...