最低公共父節點,意思很好理解。
思路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...