1、原理:二叉搜尋樹是排序過的 ,位於左子樹的結點都比父結點小,位於右子樹的結點都比父結點大,我們只需從根節點開始和兩個輸入的結點進行比較,如果當前節點的值比兩個結點的值都大,那麼最低的公共祖先結點一定在該結點的左子樹中,下一步開遍歷當前結點的左子樹。如果當前節點的值比兩個結點的值都小,那麼最低的公共祖先結點一定在該結點的右子樹中,下一步開遍歷當前結點的右子樹。這樣從上到下找到第乙個在兩個輸入結點的值之間的結點。
2、實現**
binarynode* createbinarytree(int* array, int length)
else if (array[idx]>pcur->_value)
else
return null;
} //插入元素
pcur = new binarynode(array[idx]);
if (array[idx] < ptemp->_value)
ptemp->_left = pcur;
else
ptemp->_right = pcur;
} return root;
}//搜素二叉樹尋找最近公共祖先節點
binarynode* ancestortreenode(binarynode* proot, binarynode* node1, binarynode* node2)
return null;
}
測試用例:
void funtest1()
; int length = sizeof(array) / sizeof(array[0]);
proot = createbinarytree(array, length);
binarynode* node1 = proot->_left->_left;
binarynode* node2 = proot->_left->_right;
binarynode* pnode = ancestortreenode(proot, node1, node2);
if (pnode)
cout << pnode->_value << endl;
}
1、原理:如果樹中每個結點都有父結點(根結點除外),這個問題可以轉換成求兩個鍊錶的第乙個公共結點,假設樹結點中指向父結點的指標是parent,樹的每乙個葉結點開始都由乙個指標parent串起來的鍊錶,每個鍊錶的尾結點就是樹的根結點。那麼輸入的這兩個結點位於鍊錶上,它們的最低公共祖先結點剛好是這兩個鍊錶的第乙個公共結點。
2、實現**
int hight(binarynode* root, binarynode* node)
return len;
}binarynode* getlastcommonancestor(binarynode* root, binarynode* node1, binarynode* node2)
while (node1 && node2 && node1 != node2)
if (node1 == node2)
return node1;
else
return null;
}
測試用例
void funtest()
else
q.push(cur);
} }binarynode* node1 = root->_left->_left;
binarynode* node2 = root->_left->_right;
binarynode* ancestor = getlastcommonancestor(root, node1, node2);
if (ancestor)
cout << ancestor->_value << endl;
else
cout << "沒有公共祖先" << endl;
}
1、原理:在二叉樹根結點 的左子樹和右子樹中分別找輸入的兩個結點,如果兩個結點都在左子樹,遍歷當前結點的左子樹,如果兩個結點都在右子樹,遍歷當前結點的右子樹,直到乙個在當前結點的左子樹,乙個在當前結點的右子樹,返回當前結點就是最低的公共祖先結點。
2、實現**
bool isnodeintree(binarynode* proot, binarynode* pnode)
binarynode* getcommonancestor(binarynode* proot, binarynode* node1, binarynode* node2)
測試用例
void funtest3()
else
q.push(cur);
} }binarynode* node1 = root->_left->_left;
binarynode* node2 = root->_left->_right;
binarynode* ancestor = getcommonancestor(root, node1, node2);
if (ancestor)
cout << ancestor->_value << endl;
else
cout << "沒有公共祖先" << endl;
}
標頭檔案和結點的結構體
#include#includeusing namespace std;
struct binarynode
};
求二叉樹中兩個節點的最近公共祖先
比如 在如圖這棵二叉樹中,8和9的公共祖先是1,4和5的公共祖先是2,5和2的公共祖先是2。在上述分析中,我們可以得出思路,本題解法可分為兩種情況,1 兩個節點在根節點同側 則它們的最近公共祖先可能是其中乙個節點,也可能是在到兩個節點的公共路徑上。2 兩個節點在根節點的不同側,則它們的公共祖先只能是...
求二叉樹中兩個節點的最近公共祖先
要求考慮以下三種種情況,給出解決方案,並解決 1 二叉樹是搜尋二叉樹。2 二叉樹每個節點有parent 三叉鏈 treenode publiclowparent treenode root,treenode c1,treenode c2 else if c1 data cur data c2 dat...
求二叉樹兩個節點的最近公共祖先
偶然看到乙個特別特別巧妙的方法,在此記錄一下 typedef struct xbnodexbnode,xbtree 取名叫xbtree是因為以為這個是線索二叉樹 記住!這個不是線索二叉樹,線索二叉樹是儲存了前驅和後繼的指標,包括前序線索二叉樹 中序線索二叉樹和後序線索二叉樹三種。由於建立的時候多了乙...