求兩個節點的最近公共祖先節點

2021-08-08 05:16:13 字數 1525 閱讀 1258

原文:

分三種情況 

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是因為以為這個是線索二叉樹 記住!這個不是線索二叉樹,線索二叉樹是儲存了前驅和後繼的指標,包括前序線索二叉樹 中序線索二叉樹和後序線索二叉樹三種。由於建立的時候多了乙...