本文出自:http://blog.csdn.net/svitter
题目4:二叉树
给出一颗无线的二叉树。树的每一个结点用一整数对标识。二叉树构造如下树根被标识为(1, 1);
如果一个结点被标识为(a, b), 则其左孩子被标识为(a+b,b),右孩子被标识为(a, a+b)。现在给出某一结点(a, b),求树根到该结点的最短路径,并且同时求出从树根出发向左走和向右走的次数。建议完成人数1人。
注:此处使用了STL_stack库函数,是不允许的,我图方便。
//============================================================================
// Name : BinaryTree.cpp
// Author : Vit
// Version : 1.0
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <stdio.h>
#include <stack>
using namespace std;
struct path
{
int a;
int b;
path(int c, int d):a(c), b(d){}
void print()
{
printf(" (%d, %d)", a, b);
}
};
int main()
{
int left, right;
int a, b;
stack <path> s;
while(~scanf("%d%d", &a, &b ))
{
if(a == b && a != 1)
{
printf("impossible\n");
continue;
}
right = left = 0;
while(a != b)
{
if(a > b)
{
left++;
s.push(path(a,b));
a = a - b;
}
else
{
right++;
s.push(path(a,b));
b = b - a;
}
}
printf("left_num: %d\nright_num:%d\n", left ,right);
printf("(1,1)");
while(!s.empty())
{
path b = s.top();
s.pop();
b.print();
}
printf("\n\n");
}
return 0;
}