问题:
求树种任意两个节点的最低公共节点
常见的解法是求解节点到根的路径,对路径做比对。参见: http://gaotong1991.iteye.com/blog/2042770
下面来介绍另外一种方法求解。
准备:
1、什么是最低公共节点?
2、最低公共节点有哪些方面需要注意?
答:按照两个节点是否存在一个节点(设为A)是以另外一个节点(设为B)为根的子树中,分为两种情况:
是
意味着A和B在B的一个分支下,返回B即可。
否
意味着A和B肯定在公共节点的不同分支下,可以按下文的2、3、4步骤处理。
3、如何判断两个节点是否存在一个节点(设为A)是另外一个节点(设为B)的(直接或间接)孩子?
答:如果两个节点在树的前序和后续遍历中出现的顺序相反,则说明存在;反之,不存在。
示例数据:
测试用例:
F/H-->B;B/F-->B
步骤:
1、分别输出树的前序(ABDFGEHIJC)和后续遍历结果(FGDHIJEBCA);
2、如果F、H在前序和后续中的出现顺序相反,则说明F、H存在一个节点在另外一个节点的子树中的情况(例如选择的节点是B和F,F位于以B为根子树中),直接返回前序遍历中较早出现的一个节点,程序退出。
3、对前序遍历结果求出两个节点(F,H)前面的公共节点数组(按正序排列),记为M(ABD)
4、对后续遍历结果求出两个节点(F,H)后面的公共节点(按逆序排列),记为N(ACBEJI)
5、求M,N的最大公共子序列K(AB),K的最后一个元素B就是最低公共祖先,程序退出。
特点:
1、前序遍历和后续遍历的结果对于任何两个节点而言都是可用的,意味着不管是对哪两个节点来说,都可以使用遍历的结果;
2、将非线性问题转换为线性问题——最大公共子序列。
相关推荐
jquery遍历节点树jquery遍历节点树jquery遍历节点树
利用图的深度遍历求解背包问题利用图的深度遍历求解背包问题利用图的深度遍历求解背包问题
遍历目录树 遍历目录树 遍历目录树 遍历目录树
1,结点的权值为int型 【输入形式】 输入n个结点,其为整数 【输出形式】 二叉排序树的中根序和后根序遍历结果 【样例输入】 6 49 37 65 21 48 86 【样例输出】 21 37 48 49 65 86 21 48 37 86 65 49
城市遍历求解问题 java课程设计 java设计 。。。。。。。。。。
海军教程,OSG中用遍历场景的方法获取节点 Navy tutorial,OSG used to traverse the scene to obtain the node
VC .NET 遍历树形菜单,遍历树形节点菜单的各个节点,听说过目录遍历,现在来一个菜单遍历,可遍历树控菜单的各个节点,可看成是从左边复制出来一个树形菜单到右侧视图中,本源码实现了在树控件中插入项、在树控件中...
一次遍历单链表删除倒数第n个节点的问题,跟删除某个节点的前一个节点是一个思路
设计二叉树的双序遍历设计二叉树的双序遍历设计二叉树的双序遍历设计二叉树的双序遍历设计二叉树的双序遍历设计二叉树的双序遍历设计二叉树的双序遍历设计二叉树的双序遍历设计二叉树的双序遍历设计二叉树的双序遍历...
类似题目1.二叉搜索树解法:因为二叉搜索树 左孩子>父节点>右孩子,因此可以从跟遍历如果传入的两个节点都小于当前比较的节点,那么这两个节点的公共节点在当前比较节
利用深度优先算法求解网络中两点之间的所有路径数目
order traversal)来遍历一个二叉树的例子,所谓双序遍历就是对于二叉树的每一个结点来说,先访问这个结点,再按双序遍历它的左子树,然后再一次访问这个结点,接下来按双序遍历它的右子树。。
二叉树的各种遍历(前序、中序、后序、层序),以及计算树的叶子树和树的深度
实现树的遍历并且反应树的节点的基本信息,反应树的节点基本的数量,可用于一般树的遍历
二叉树遍历问题 二叉树遍历求解问题
在完全二叉树中,在层次遍历和先根序遍历中,已知某节点在一种遍历中的编号,求该节点在另一种遍历中的编号。 程序描述: q = 1表示已知某节点在先根序遍历中的编号,求的是它在层次遍历中的编号。 q = 2表示已知的...
二叉树作业,树的前中后序遍历,外加求深度、节点数、叶子节点数
要求: 1. 先任意创建一个图; 2. 图的DFS,BFS的递归和非递归算法的实现 3. 最小生成树(两个算法)的实现,求连通分量的实现 4. 要求用邻接矩阵、邻接表、十字链表等多种结构存储实现
java多叉树的实现:节点集合生成多叉树,单个节点添加到多叉树,深度遍历,广度遍历
遍历网页中的节点 js+html 遍历网页中的节点