二叉樹的公共父結點
阿新 • • 發佈:2019-01-10
題目描述:
1
/ \
2 3
/ \ / \
4 5 6 7
/\ /\ /\ /\
如上圖所示,由正整數 1, 2, 3, ...組成了一棵無限大的二叉樹。從某一個結點到根結點(編號是1的結點)都有一條唯一的路徑,比如從5到根結點的路徑是(5, 2, 1),從4到根結點的路徑是(4, 2, 1),從根結點1到根結點的路徑上只包含一個結點1,因此路徑就是(1)。對於兩個結點x和y,假設他們到根結點的路徑分別是(x1, x2, ... ,1)和(y1, y2,...,1),那麼必然存在兩個正整數i和j,使得從xi 和yj 開始,有xi = yj,xi + 1 = yj + 1,xi + 2 = yj + 2,...
現在的問題就是,給定x和y,要求他們的公共父節點,即xi(也就是 yj)。
輸入描述:
輸入包含多組資料,每組資料包含兩個正整數x和y(1≤x, y≤2^31-1)。
輸出描述:
對應每一組資料,輸出一個正整數xi,即它們的首個公共父節點。
輸入樣例:
10 4
輸出樣例:
2
解題思路:
設子節點序號為x,因為題目給的這棵無限大的二叉樹是一棵完全二叉樹,所以其父節點序號為int(x/2)。
AC程式碼:
#include <bits/stdc++.h> using namespace std; int main() { int x,y; while(cin >> x >> y) { while(x != y) { x>y? x=x/2 : y=y/2; } //當x和y相等時,說明找到了它們的首個公共父結點 cout << x << endl; } return 0; }