尋找最低公共父節點

2021-06-07 19:47:18 字數 1843 閱讀 9572

最低公共父節點,意思很好理解。

思路1:最低公共父節點滿足這樣的條件:兩個節點分別位於其左子樹和右子樹,那麼定義兩個bool變數,leftflag和rightflag,如果在左子樹中,leftflag為true,如果在右子樹中,rightflag為true,僅當leftflag == rightflag == true時,才能滿足條件

#include using namespace std;

struct node

node *left;

node *right;

int data;

};node *constructnode(node **pnode1, node **pnode2)

bool isnodein(node *root, node *node1, node *node2)

if (root == null)

return false;

if (root == node1 || root == node2)

else }

node *lowestfarther(node *root, node *node1, node *node2)

bool leftflag = false;

bool rightflag = false;

leftflag = isnodein(root->left, node1, node2);

rightflag = isnodein(root->right, node1, node2);

if (leftflag == true && rightflag == true)

else if (leftflag == true)

else }

void main()

else

}

思考:在面試的時候,得和面試官溝通,考慮以下情形

1. node1和node2指向同一節點,這個如何處理

2. node1或node2有不為葉子節點的可能性嗎

3. node1或node2一定在樹中嗎

還要考慮乙個效率問題,上述**中用了兩個遞迴函式,而且存在不必要的遞迴過程,仔細思考,其實乙個遞迴過程足以解決此問題

#include using namespace std;

struct node

int data;

node *left;

node *right;

};node *constructnode(node **pnode1, node **pnode2)

bool lowestfather(node *root, node *node1, node *node2, node *&dest)

if (leftflag == true || rightflag == true)

return true;

}int main()

else

return 0;

}

換一種方式的寫法:

#include using namespace std;

struct node

int data;

node *left;

node *right;

};node *constructnode(node **pnode1, node **pnode2)

node* lowestfather(node *root, node *node1, node *node2)

int main()

else

return 0;

}

樹中兩個節點的最低公共父節點

題目 給出兩個結點a和b,求解這兩個結點的最低公共祖先 lca 條件 1 樹為二叉搜尋樹 思路 二叉搜尋樹指的是每個父節點有兩個子節點,並且節點的左子樹均小於節點值,右子樹上節點的值大於節點的值。所以我們求兩個節點的最低公共父節點應滿足 父節點大於其中乙個節點且小於另外乙個。如果此時搜尋的節點大於這...

尋找最低數

給你乙個正整數a 1 a 100 輸出a的最低數。例如,給你a 26,我們可以將a化成二進位制為11010,則a的最低數是10,輸出10的十進位制為2。再例如,給你a 88,我們可以將a化成二進位制為1011000,則a的最低數是1000,輸出為8。輸入包含多組測試樣例。每行輸入乙個正整數a 1 a...

最低公共祖先

二叉樹結點的定義如下 cpp view plain copy struct node 給定二叉樹中的兩個結點,輸出這兩個結點的最低公共祖先結點 lca 注意,該二叉樹不一定是二叉搜尋樹。比如給定的二叉樹如下所示,則可以知道結點1和5的最低公共祖先結點為5,結點4和5的最低公共祖先結點為5。3 5 1...