求二叉树中节点的最大距离,两个节点的距离的定义是这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度
这是论坛上的一道算法题,我目前想到的解法是:
二叉树中任意两个节点间的最大距离,那么其中一个节点必定是层次最深的一个节点,记该节点为A。该二叉树中层次最深的节点可能有多个,但只需要选择其中一个记为A。找出了A,那么遍历二叉树中其它非A的节点,访问各节点的时候求出该节点到A的距离,从而记录下求到的最大距离。
因此题目可以转化为:求一个二叉树中,给定的两个节点间的距离。
首先就要求出这两个不同的节点间的公共父节点,这个题目出过多次了,解法是:
假设两个节点为A和B,中序遍历二叉树,遍历的时候记录下各节点的层次深度,同时,遇到A或者B的时候开始记录层次最浅的节点,直到遇到B或者A的时候,或者遇到根节点(层次深度为0)的时候,终止记录。那么,记录下来的层次最浅的节点就是A和B的公共父节点。这个算法的原理是A和B的公共父节点必在中序遍历后的A和B之间。
如果求得两个不同节点(记为A和B)之间的公共父节点(记为P),那么事情就很简单了,A和B之间的距离就是A和P之间的距离,加上B和P之间的距离,也就是A和P之间的层次差,与B和P之间的层次差,它们两者之和。
这只是一个初步的算法,远远算不上高效,因为找到A之后,还需要两次嵌套遍历二叉树,外层是求各个节点到A的距离,内层是求各个节点与A的公共父节点。正因为如此,应该存在巨大的优化空间。
求二叉树中节点的最大距离
最新推荐文章于 2016-11-02 16:46:45 发布