【剑指offer】q50:树节点最近的祖先
#@ root: the root of searched tree
#@ nodeToFind: the tree-node to be found
#@ path: the path from root to node
#@@
#@@ search tree referenced by root, and return the path
#@@ from root to node, if node not exist, path = []
#@@ def getPath(root, nodeToFind, path):
if ( None == root or None == nodeToFind):
return False
# case 1: current root == node, so insert to path
if root == nodeToFind:
path.insert(0, root)
return True
# search in left barch and right branch
bFindInLeft = False
bFindInRight = False if root.left:
bFindInLeft = getPath(root.left, nodeToFind, path) if False == bFindInLeft and root.right :
bFindInRight = getPath(root.right, nodeToFind, path) # case 2: nodeToFind in subtree of root, insert root
if bFindInLeft or bFindInRight:
path.insert(0, root)
return True return False
函数的功能是在root 表示的树中查找nodeToFind 结点,若找到,则在返回的时候,将路径结点增加到path中,关于树的遍历有三种。这里我们使用后序遍历。目的是在知道全部情况后,再对root进行处理,由于当前的结点root应不应该增加到路径path中。不仅跟当前的结点root有关,还跟它的子结点有关,也就是若当前结点就是要找的结点,那么将当前结点增加是没有问题的,可是即使当前结点不是要查找的结点,而其子树中有查找结点时。当前结点也是要增加到路径中去的。这样就不用每次都将结点插入,条件不满足时还要进行结点的pop。
def getClosetParent(root, node1, node2):
path1 = []; path2 = []
if None == root or None == node1 or None == node2:
return None #get the path from root to node1 and node2
getPath(root, node1, path1)
getPath(root, node2, path2) # find closet parent of node1 and node2
shorPathLen = min( len(path1), len(path2) )
for i in range(1, shorPathLen):
if path1[ i ] != path2[ i ] and \
path1[ i - 1 ] == path2[ i - 1 ]:
return path1[ i - 1 ] return None
由于在getPath函数里,我们获得的路径是从root開始的,即root为path列表的第一个结点。那么我们就从root開始,一次比較,找到最后一个相等的。就是二者近的共同祖先。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
【剑指offer】q50:树节点最近的祖先的更多相关文章
- 剑指Offer——Trie树(字典树)
剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种的单词.对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位 ...
- 《剑指offer》 树的子结构
本题来自<剑指offer> 树的子结构 题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路: 分两步走: 第一步:判断根节点,两个根节 ...
- 剑指Offer:树的子结构【26】
剑指Offer:树的子结构[26] 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路 分为两步: 第一步:在树A中找到和树B的根节点的值一 ...
- 剑指 Offer 26. 树的子结构
剑指 Offer 26. 树的子结构 Offer 26 题目详情: 题解分析 解法一: 第一种比较容易想到的解法就是查看这两棵树的前序遍历和中序遍历序列是否都匹配. 因为前序遍历和中序遍历可以唯一确定 ...
- 剑指offer 判断树是不是对称的
html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, & ...
- 【剑指Offer】树的子结构 解题报告(Python)
[剑指Offer]树的子结构 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...
- 【剑指offer】树的子结构
转载请注明出处:http://blog.csdn.net/ns_code/article/details/25907685 剑指offer第18题,九度OJ上測试通过! 题目描写叙述: 输入两颗二叉树 ...
- 【Java】 剑指offer(26) 树的子结构
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入两棵二叉树A和B,判断B是不是A的子结构. 思路 1)先对A树 ...
- Go语言实现:【剑指offer】树的子结构
该题目来源于牛客网<剑指offer>专题. 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) Go语言实现: type TreeNode stru ...
- 《剑指offer》树专题 (牛客10.25)
考察的知识点主要在于树的数据结构(BST,AVL).遍历方式(前序,中序,后序,层次).遍历算法(DFS,BFS,回溯)以及遍历时借助的数据结构如队列和栈.由于树本身就是一个递归定义的结构,所以在递归 ...
随机推荐
- HTML中Id和Name的区别
源地址:http://www.cnblogs.com/laodai/articles/2244215.html 在html中:name指的是用户名称,ID指的是用户注册是系统自动分配给用户的一个序列号 ...
- javascript --- 事件托付
javascript 之 事件托付 长处:1.提高性能(仅仅须要对父级进行操作,子节点相同会拥有其相关属性和方法) 2.对于新加入的事件.也让其拥有父级事件的属性 <!doctype html& ...
- Windows系统版本号判定那些事儿
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- Queue 消息的发送与接收(PTP 消息传递模型)
上篇博客写到了JMS两种消息模型(P2P.pub/sub)<JMS两种消息模型>.本篇博客通过一个实例来进一步了解P2P模型. Queue消息的发送与接收--PTP消息传递模型,样例: Q ...
- 一段代码让你秒懂java方法究竟是传值还是传地址
先看看代码以及执行结果: 凝视写得非常清楚了.我就不多说了. 我说说我的结论.事实上在java中没有传值还是传址的概念,java仅仅有引用的概念.引用类似传址.只是是一个变量名中保存着对象的地址,地址 ...
- java matlab混合编程之返回值Struct类型
java matlab混合编程的时候当返回值是Struct类型(matlab中的返回类型)如何来取得(java中)其值? 上网找,看到这个网页:http://www.mathworks.cn/cn/h ...
- POJ2112_Optimal Milking(网洛流最大流Dinic+最短路Flody+二分)
解题报告 农场有k个挤奶机和c头牛,每头牛到每一台挤奶机距离不一样,每台挤奶机每天最多挤m头牛的奶. 寻找一个方案,安排每头牛到某一挤奶机挤奶,使得c头牛须要走的全部路程中的最大路程的最小值. 要使每 ...
- Net 通常用于dll 第三方插件
log4net.dll ----记录日志 本人用能够 pangu.dll ----分词工具 用于高级搜索 拆分字词 能够非常好用 fastreport --------高速制作报表工具 本人仅仅做过 ...
- Java---25---集合框架共性方法
集合类 为什么会出现集合类 面向对象语言对事物的体现都是以对象的形式,所以为了方便对较多个对象的操作,就对对象进行存储,集合就是存储对象最经常使用的一种方式 数组和集合类同一时候容器,有何不同? 数组 ...
- Java提高篇(三二)-----List总结
前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点能够对List接口有了比較深的了解了.仅仅有通过归纳总结的知 ...