求二叉树两节点的最小父节点(有父节点指针)
2015-09-13 21:20
267 查看
给定一颗二叉树,以及其中的两个node(地址均非空),要求给出这两个node的一个公共父节点,使得这个父节点与两个节点的路径之和最小。描述你程序的最坏时间复杂度,并实现具体函数,函数输入输出请参考如下的函数原型:
C++函数原型:
思路一:我们首先找到两个节点的高度差,然后从较靠近根结点的一层开始向上找,若父节点为同一节点则该节点为解。
思路二:若允许浪费空间,那么可以用两个Stack来存储从first和second到根结点的各个节点,然后出栈时比较地址是否一致,最后一个地址一致的节点为解。
两种方法最坏时间复杂度均为O(n)。
C++函数原型:
strucy TreeNode{ TreeNode* left; //指向左子树 TreeNode* right; //指向右子树 TreeNode* father; //指向父亲节点 }; TreeNode* LowestCommonAncestor(TreeNode* first,TreeNode* second){ }
intgetHeight(TreeNode *node) { intheight = 0; while(node) { height++; node = node->parent; } returnheight; } TreeNode* LowestCommonAncestor(TreeNode* first,TreeNode* second) { intheight1 = getHeight(first), height2 = getHeight(second), diff = height1 - height2; if(diff < 0) { diff = -diff; while(diff--) { second = second->parent; } } else{ while(diff--) { first = first->parent; } } while(first != second) { first = first->parent; second = second->parent; } returnfirst; }
思路二:若允许浪费空间,那么可以用两个Stack来存储从first和second到根结点的各个节点,然后出栈时比较地址是否一致,最后一个地址一致的节点为解。
两种方法最坏时间复杂度均为O(n)。
相关文章推荐
- iOS中的视图跳转的三种方式(代码跳转,根据桥跳转,按钮跳转)
- 函数对象
- 1 Two Sum
- rpm和yum程序包的管理
- Hadoop系列之十:Hadoop配置文件及常用配置参数详解(未完成)
- 【bzoj3251】树上三角形
- hdu 5443 The Water Problem(RMQ区间最值)
- DispatcherServlet--Spring的前置控制器作用简介
- JS函数修改html的元素内容,及修改属性内容
- 数据结构之---C语言实现银行模拟(离散化)
- 解决嵌入式Linux中的时区问题
- CentOS6.6安装VirtualBOX
- 《模式识别和机器学习》资源
- gvim 安装pathogen
- 机器学习中的数学:强大的矩阵奇异值分解(SVD)及其应用
- 数据型数据库redis
- 多线程
- C语言初步接触
- linux_磁盘管理与文件系统
- PreTranslateMessage作用和使用方法