1. 程式人生 > >完全二叉樹兩個結點的公共結點

完全二叉樹兩個結點的公共結點

題目描述

      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,即它們的首個公共父節點

分析

在完全二叉樹中,一個結點x的父節點一定是x/2,那麼兩個結點的公共結點就是不斷地找各自的父節點直到有相等的父節點

// write your code here cpp
#include <iostream>
using namespace std;

int main(){
    int a, b;
    while(cin >> a >> b){
        while(a != b){
            if(a > b) a /= 2;// 大者先找父結點
            else b /= 2;
        }
        cout << a << endl;
    }
    return 0;
}