微软等公司数据结构+算法面试100题--树
2012-04-25 18:03 iamzhaiwei 阅读(293) 评论(0) 编辑 收藏 举报引用自博客 http://blog.csdn.net/v_JULY_v
1.(原第1题)
----------------------------------------------
把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
2.(原第4题)
----------------------------------------------
百度笔试题:在二元树中找出和为某一值的所有路径
题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7。
分析:这道题考查对二叉树遍历方式的理解,采用后序遍历,如果把二叉树看成图,就是图的深度遍历。使用变量存放当前遍历的路径和,当访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。如果当前结点为叶结点并且当前路径的和刚好等于输入的整数,则当前的路径符合要求,我们把它打印出来。如果当前结点不是叶结点,则继续访问它的子结点。当前结点访问结束后,递归函数将自动回到父结点,因此我们在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是根结点到父结点的路径。
扩展题:如果将条件放宽,计算和的路径改为从根节点到叶子节点路径上任意连续子路径呢?
条件改变之后,难度有所增加,堆栈中光存放从root到当前节点的和显然不够,需要对堆栈中的元素做出改变,使之存放堆栈当前位置到当前遍历节点的路径和。
3.(原第9题)
----------------------------------------------
判断整数序列是不是二元查找树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。
分析:对于二叉查找树,根节点的值大于所有左子树的节点值,小于所有右子树的节点值。现在只有一个数组,如何判断呢?对于这个数组,最后一个元素A[n-1]一定对应二叉树的根节点,寻找左子树对应的子数组,对于分出的左子树和右子树采用递归方法去判断。
----------------------------------------------
求二叉树中节点的最大距离。
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。
写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。
5.(原第15题):
----------------------------------------------
题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ \
6 10
/\ /\
5 7 9 11
输出:
8
/ \
10 6
/\ /\
11 9 7 5
6.(原第16题)
----------------------------------------------
题目(微软):
输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
例如输入
8
/ \
6 10
/ \ / \
5 7 9 11
输出8 6 10 5 7 9 11。
7.(原第39题(1),原第50题(1))
----------------------------------------------
网易有道笔试:
求一个二叉树中任意两个节点间的最大距离,
两个节点的距离的定义是 这两个节点间边的个数,
比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。
8.(原第43题)
----------------------------------------------
递归和非递归俩种方法实现二叉树的前序遍历。
9.(原第52题)
----------------------------------------------
二元树的深度。
题目:输入一棵二元树的根结点,求该树的深度。
从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
例如:输入二元树:
10
/ \
6 14
/ / \
4 12 16
输出该树的深度3。
分析:这道题本质上还是考查二元树的遍历。
10.(原第75题)
----------------------------------------------
二叉树两个结点的最低共同父结点
题目:二叉树的结点定义如下:
struct TreeNode
{
int m_nvalue;
TreeNode* m_pLeft;
TreeNode* m_pRight;
};
输入二叉树中的两个结点,输出这两个结点在树中最低的共同父结点。
分析:求树中两个结点的最低共同父结点是面试中经常出现的一个问题。这个问题至少有两个变种。
11.(原第86题)
----------------------------------------------
编写一个程序,把一个有序整数数组放到二叉查找树中。
分析:本题考察二叉搜索树的建树方法,简单的递归结构。关于树的算法设计一定要联想到递归,因为树本身
就是递归的定义。而,学会把递归改称非递归也是一种必要的技术。毕竟,递归会造成栈溢出,关于系统底层
的程序中不到非不得以最好不要用。但是对某些数学问题,就一定要学会用递归去解决。
12.(原第98题(4)(5))
----------------------------------------------
微软
(1).怎样编写一个程序,把一个有序整数数组放到二叉树中?
(2).怎样从顶部开始逐层打印二叉树结点数据?请编程。