原文:
分三種情況
1、搜尋二叉樹,根據搜尋二叉樹的性質,左子樹的所有節點比根節點小,右子樹的所有節點比跟節點大。
如果兩個節點都比根節點小,則遞迴左子樹
如果兩個節點都比跟節點大,則遞迴右子樹
否則,兩個節點乙個在左子樹,乙個在右子樹,則當前節點就是最近公共祖先節點。
2、二叉樹有指向父節點的指標。問題轉換成判斷兩個鍊錶是否相交。
先分別求出從兩個節點到根節點的路徑長度,讓路徑長的節點先走多出來的幾步,接著同時走,每走一步判斷兩個節點是否相等。
3、普通二叉樹
先找出從跟節點分別到兩個節點的路徑。(方法:二叉樹後序遍歷的非遞迴,將遍歷的節點儲存在list中。)
兩個list同時往前走,找出最後乙個相等的節點,就是最近公共祖先節點
1、搜尋二叉樹
node* _findcommonnode(node *&root,node *&n1, node *&n2)
2、有父指標
int getlength(node *node)
return len;
}//求兩個節點的最近公共祖先,有指向父節點的指標的情況,轉化為求兩個鍊錶的交點問題
node *findcommonnode1(node *n1, node *n2)
else
//讓路徑較長的先走gap步
for (int i =
0; i < gap; i++)
longlength = longlength->_parent;
//接下來一起向前走,直到找到公共節點停止
while (longlength && shortlength && (longlength->_key != shortlength->_key))
//直到找到公共節點
if (longlength->_key == shortlength->_key)
return longlength;
else
//其他情況
return
null;
}
3、普通二叉樹
//通過非遞迴後序遍歷的方式找到節點的路徑
bool getroute(node *&root, node *&node, list
& path)
if (!path.empty())
else
//否則繼續遍歷右子樹
cur = back->_right;
}
}return
false;
}//求兩個節點的最近公共祖先,普通二叉樹
//1、先找出兩個節點的路徑,儲存在鍊錶中
//2、遍歷鍊錶找到最後乙個不相等的節點,即為最近公共祖先節點
node *findcommonnode2(node *n1, node *n2)
return commonnode;
}
找兩個節點的最近公共祖先
給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 分三種情況 如果這兩個節點其中乙個是根節點,直接返回根節點 如果乙個結點在左子樹,另乙個在右子樹,直接返回根節點 如果兩個都在左子樹或者都在右子樹上,直接使用...
求樹中兩個節點的最近公共祖先(版本2)
1.求樹中兩個節點的最近公共祖先 版本2 我們來看 這個問題 的 第二種解析思路 在第一種思路中,我們將 這個題意理解為,這棵樹是一顆二叉搜尋樹.在第二種思路中,我們將 這棵樹,理解為一顆普通的樹,或許它都不是二叉樹,不過這不重要 不過為了方便測試,我們將用結點中含有指向父節點指標的二叉樹進行測試 ...
求二叉樹兩個節點的最近公共祖先
偶然看到乙個特別特別巧妙的方法,在此記錄一下 typedef struct xbnodexbnode,xbtree 取名叫xbtree是因為以為這個是線索二叉樹 記住!這個不是線索二叉樹,線索二叉樹是儲存了前驅和後繼的指標,包括前序線索二叉樹 中序線索二叉樹和後序線索二叉樹三種。由於建立的時候多了乙...