云淡风轻
Stay foolish,stay hungry.

1,写一个算法,要求给定一个二叉树,算法能够返回其高度?
解答:可以递归地去求子树的高度,这个问题的子问题就是,以当前节点为根的树德高度,为其左右子树高度的最大者再+1。定义空节点的高度为-1,叶子节点的高度为0,伪代码如下:
int Tree-Height(Node* root)               //root为当前所访问节点
{
if (root == NULL)
return -1;
  else
return max( Tree-Height(root.left()), Tree-Height(root.right()) ) +1;
}


2,给定一颗二叉树和两个节点,写一个算法求离他们最近的公共父节点(假设:除了关键字key之外,1,每个节点有父指针,左右孩子指针的情况,2,每个节点只有左右孩子指针的情况),要求给出这两种假设下的算法?

解答: 先给出在条件1下的解答,即每个节点包含指向父节点的指针parent的情况。这个问题可以规约为求两个单向链表的交点问题,假设两个节点分别为x和y,那么以x为链表起点,以该二叉树根节点为终点的链表就是L(x),相应的以y为链表起点,以二叉树根为终点的链表就是L(y),那么问题就归结为求这两个链表L(x)和L(y)交点问题。伪代码如下:
Node *common_parent(Node *n, Node *x, Node *y)
{
//先求出两个链表的长度L1和L2
int L1=0;
int L2=0;
int distance=0;    //两个链表长度之差
Node *t1=x;
Node *t2=y;
 //求两个链表的长度
while(t1 -> parent != NULL)
{
t1 = t1->parent;
L1++;
}
while(t2 -> parent != NULL)
{
t2 = t2 -> parent;
L2++;
}
distance = L1 > L2 ? L1-L2  : L2-L1;
//用两者的长度之差来修正长链表的其实位置
t1 = L1 > L2 ? x : y ;
t2 = L1 > L2 ? y : x ;
while(distance >0 )
t1 = t1 -> parent;
//然后两个链表分别从修正后的起始位置开始,一块移动,直到某个相同的节点停止,该节点就是答案
while(t1 != t2)
{
t1 = t1 -> parent;
t2 = t2 -> parent;
}
return t1;
}
在程序中有比较两个节点是否相同的情况,只需要比较指向它的存储地址(即指针内容)即可。

3,给定一个二叉树,求这个树中距离最远的两个节点的距离?(提示:这个题目是求二叉树高度的扩展)
解答:还是利用递归的思想来求,分析这个问题的子问题就是,以当前节点为根的子树中两个节点的最远距离,就是左子树中两个节点的最远距离max_left、右子树中两个节点的最远距离max_right和左右子树的高度之和left_height+right_height+2,这三个值中的最大值。定义空节点的高度为-1,左右子树的最大两个节点的距离为-1.
由于除了要保存最大距离之外,还要要在递归的过程中求树的高度,所以要用一个结构体来存储每次的返回值:
struct info
{
int max_value;
int height;
};
int max_distance(Node *n)
{
info value, value_left, value_right;
if(n == NULL)
{
value.max_value=-1;
value.height=-1;
return value;
}
value_left= max_distance(n -> left);
value_right= max_distance(n -> right);
//设置当前节点下的树中相距最远的两个节点的距离
value.max_value = max{ value_left.max_value, value_right.max_value, value_left.height+value_right.height+2 };  
//设置当前节点的高度
value.height = max{ value_left.height, value_right.height } +1;
return value;
}
}
4,石子移动问题,现在假定有n个节点的二叉树,并且有n个石子散落在这n个节点的二叉树中,每个节点可能有0个,1个或多个石子,写一个算法,能够将所有石子平均的分配在每个节点上,并且能够证明该算法是移动的最少次数的算法。
posted on 2011-11-26 17:21  kevin Lee  阅读(573)  评论(0)    收藏  举报