【數據結構】-樹-兩個節點的最近祖先點

一.線性存儲方式 

誰的父節點編號更大,誰就繼續向上求一個父節點

 

 

 

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章