【剑指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,回溯)以及遍历时借助的数据结构如队列和栈.由于树本身就是一个递归定义的结构,所以在递归 ...
随机推荐
- C#日期函数使用大全
1 DateTime dt = DateTime.Now; 2 3 dt.ToString();//2005-11-5 13:21:25 4 5 dt.ToFileTime().ToString(); ...
- 如何得到动态链接库的输出函数tdump命令(225篇博文)
有的时候,我们需要查看一个动态链接库的输出函数列表,有很多软件可以满足此要求,比如说 exeScope.不过,去下载一个软件总归是很麻烦,Delphi 本身就自带一个类似的工具,那就是 tdump.e ...
- hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)
http://acm.hdu.edu.cn/showproblem.php?pid=3221 一晚上搞出来这么一道题..Mark. 给出这么一个程序.问funny函数调用了多少次. 我们定义数组为所求 ...
- [Cocos2d-x]CCSpriteBatchNode的使用
文档: http://cocos2d.cocoachina.com/document/index/class?url=dd/d95/classcocos2d_1_1_c_c_sprite_batch_ ...
- iOS文件保存策略
Where You Should Put Your App’s Files To prevent the syncing and backup processes on iOS devices fro ...
- selenium让人摸不着头脑的问题
selenium让人摸不着头脑的问题 问题一 使用webdriver驱动firefox浏览器时如果不设置参数,默认使用的Firefox的profile和平时打开浏览器使用的firefox不一样,如果要 ...
- FZU2179(数位dp)
传送门:Chriswho 题意:求区间[1,n]内能整除自己本身各位数字的数的个数. 分析:这题跟CF 55D Beautiful numbers一样的,一个数能被它的所有非零数位整除,则能被它们的最 ...
- hdu4586(概率、期望)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4586 题意:有一个色子,n面,每面有个分值a[i],其中有m面比较特殊,当该面出现时,可以再投一次.求 ...
- HDU 4916 树分治
Mart Master II Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- cocos2dx使用tolua关于字符串处理的一个问题
正在使用cocos2dx的tolua binding在此过程中发现的一个问题.假设一回或输入是std::string当我们不同意包括二进制数据,和std::string我同意,这样一来就导致了不正确的 ...