面试题50:树中两个节点最低公共祖先
2016-07-21 20:28
375 查看
树是查找二叉树
也就是树是排序过的,位于左子树上的结点都比父结点小,而位于右子树的结点都比父结点大。我们只需要从根结点开始和两个结点进行比较。如果当前结点的值比两个结点都大,则最低的共同父结点一定在当前结点的左子树中。如果当前结点的值比两个结点都小,则最低的共同父结点一定在当前结点的右子树中。树不一定是二叉树,每个结点都有一个指针指向它的父结点
我们可以从任何一个结点出发,得到一个到达树根结点的单向链表。因此这个问题转换为两个单向链表的第一个公共结点。一般树
找到两棵树的路径,遍历找公共节点bool GetNodePath(TreeNode* pRoot, TreeNode* pNode, list<TreeNode*>& path) { if(pRoot == pNode) return true; path.push_back(pRoot); bool found = false; vector<TreeNode*>::iterator i = pRoot->m_vChildren.begin(); while(!found && i < pRoot->m_vChildren.end()) { found = GetNodePath(*i, pNode, path); ++i; } if(!found) path.pop_back(); return found; } TreeNode* GetLastCommonNode ( const list<TreeNode*>& path1, const list<TreeNode*>& path2 ) { list<TreeNode*>::const_iterator iterator1 = path1.begin(); list<TreeNode*>::const_iterator iterator2 = path2.begin(); TreeNode* pLast = NULL; while(iterator1 != path1.end() && iterator2 != path2.end()) { if(*iterator1 == *iterator2) pLast = *iterator1; iterator1++; iterator2++; } return pLast; } TreeNode* GetLastCommonParent(TreeNode* pRoot, TreeNode* pNode1, TreeNode* pNode2) { if(pRoot == NULL || pNode1 == NULL || pNode2 == NULL) return NULL; list<TreeNode*> path1; GetNodePath(pRoot, pNode1, path1); list<TreeNode*> path2; GetNodePath(pRoot, pNode2, path2); return GetLastCommonNode(path1, path2); }
相关文章推荐
- 一个小面试题sql
- 【转载】.NET程序员走向高端必读书单汇总
- 面试题47:不加加减乘除做加法
- 黑马程序员:我有故事和烈酒,是否愿意跟我走
- android 面试(基础篇 2)
- Android工程师面试题大全
- 黑马程序员:秣马厉兵,只为暑期一战!
- 透过硅谷工程师文化看顾问的职业常青
- PHP 程序员10条最容易犯的错误
- 程序员的基本追求
- 面试题46:求1+2+...+n
- 前端开发面试经典题献给大家!
- 怎么写出一本程序员风格的小说——转自知乎
- 面试题49:把字符串转换成整数(atoi)
- 互联网公司面试题库
- 机器学习面试材料
- 国内互联网公司算法&机器学习岗(阿里星)面试总结
- 想要惊艳面试官?你一张嘴就输了
- 几种查找数组的前K个最小值的算法
- 为什么越来越多人选择小而美的公司?