一.線性存儲方式
誰的父節點編號更大,誰就繼續向上求一個父節點
char FindNearParent(vector<char> a,int i,int j) {
if (a[i] != '#' && a[j] != '#') {
while (i!=j)
{
if (i > j) {
i = i / 2;
}
if (j > i) {
j = j / 2;
}
}
}
else {
cout << "節點不存在" << endl;
return '?';
}
return a[i];
}
int main() {
//p113 第五題
int n;
cout << "輸入樹的節點個數" << endl;
cin >> n;
vector<char> a(n + 1);
cout << "輸入節點,空節點標記#" << endl;
for (int i = 1; i < n+1; i++) {//爲了配合樹的性質,必須從下標1開始
cin >> a[i];
}
int i, j;
cout << "輸入兩個節點的編號" << endl;//編號指的是數組的下標
cin >> i >> j;
cout << FindNearParent(a,i, j);
}
二.二叉鏈表存儲方式
BiTree Find_LCA(BiTree T , char p, char q) {
if (T == NULL || T->data == p || T->data == q) return T;//遞歸出口,如果爲其中的一個,或者自己是空
BiTree left = Find_LCA(T->lchild, p, q);//在左邊找有沒有
BiTree right = Find_LCA(T->rchild, p, q);//在右邊找有沒有
if (left != NULL && right != NULL)return T;//左右有右邊有,那就是它了
if (left != NULL)return left;//左邊有,繼續往左邊找
if (right != NULL)return right;//右邊有繼續往右邊找
return NULL;
}