樹中兩個節點的最低公共祖先

一.樹中兩個節點的最低公共祖先

題目一:輸入兩個二叉搜索樹的結點,求兩個結點的最低公共祖先,所謂的最低公共祖先是指距離兩個節點最近的共同祖先。yii

例如: 
這裏寫圖片描述spa

解題思路:指針

  • 1.二叉搜索樹具備一個很好的特色。以當前結點爲根節點的左邊結點的值都是小於根節點的值,右邊結點的值都大於根節點的值。
  • 2.根據這個特色,若是給的兩個節點的值都小於根節點,那麼它們的最低公共祖先就必定在它左子樹。
  • 3.若是給的兩個節點的值都大於根節點,那麼它們的最低公共祖先就必定在它右子樹。
  • 4.若是一個結點的值大於根節點的值一個結點的值小於根節點的值,那麼這個根節點就是它的最低公共祖先。 
    代碼實現:
//求兩個節點的最低公共祖先(遞歸解法)
BSTreeNode* GetCommenParent_R(BSTreeNode* root, BSTreeNode* bstn1, BSTreeNode* bstn2)
{
    if (root == NULL || bstn1 == NULL || bstn2 == NULL)
        return NULL;

    if ((bstn1->_data < root->_data) && (bstn2->_data< root->_data))
    {
        GetCommenParent_R(root->_left, bstn1, bstn2);
    }
    else if ((bstn1->_data>root->_data) && (bstn2->_data>root->_data))
    {
        GetCommenParent_R(root->_right, bstn1, bstn2);
    }
    else
        return root;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

題目二:假設在修改一下上述題目的條件,所給的樹不是一棵二叉搜索樹,甚至不是一棵二叉樹,只是一棵簡單的樹,可是樹中的結點存在着指向父節點的指針,那麼要怎麼求出兩個結點的最低公共祖先呢? 
這裏寫圖片描述code

解決思路:轉換題目。blog

  • 1.假設在上邊的樹中,題目給出3和78兩個結點
  • 2.咱們能夠發現從樹的葉節點到根節點有惟一的一條路徑,也就是一條鏈表
  • 3.3->12->32,78->45->32
  • 4.要求它們的最低公共祖先,就是轉換成求上述兩條鏈表的第一個公共結點

求兩條鏈表的第一個公共結點位於個人另外一篇博客: 遞歸

https://weheartit.com/5QkVAOpNOjUHk
https://weheartit.com/UUVryii4I2Q9
https://weheartit.com/uYjLBGRUfWqD圖片

待完成!博客

相關文章
相關標籤/搜索