算法面试——二叉树最低公共祖先LCA
来源:互联网 发布:万网域名赎回费用 编辑:程序博客网 时间:2024/05/30 05:02
转:http://blog.csdn.net/getnextwindow/article/details/24091311
题目:输入二叉树的俩个节点,求它们的最低公共祖先
算法分析:我们直接来分析O(n)的算法。
比如求节点F和节点H的最低公共祖先,先求出从根节点A到F的路径,再求出A到H的路径,那么最后一个相同的节点就是最低公共祖先。A->B->D->F和A->B->E->H,最后相同的节点事B,所以最低公共祖先是B节点。求根节点到指定节点的算法先前已经更新过了,复杂度是O(n),所以总的时间复杂度是O(n)。
获取从根节点到指定节点的函数代码:
- struct BinaryNode
- {
- char value;
- BinaryNode *left;
- BinaryNode *right;
- };
- bool GetNodePath(BinaryNode *pRoot,BinaryNode *pNode,vector<BinaryNode*> &v)
- {
- if(pRoot==NULL)
- return false;
- v.push_back(pRoot);
- if(pRoot==pNode)
- return true;
- bool found=GetNodePath(pRoot->left,pNode,v);
- if(!found)
- found=GetNodePath(pRoot->right,pNode,v);
- if(!found)
- v.pop_back();
- }
求最低公共祖先节点:
- BinaryNode* GetCommonParent(BinaryNode *pRoot,BinaryNode *pNode1,BinaryNode *pNode2)
- {
- if(pRoot==NULL || pNode1==NULL || pNode2==NULL)
- return NULL;
- vector<BinaryNode*> v1,v2;
- GetNodePath(pRoot,pNode1,v1);
- GetNodePath(pRoot,pNode2,v2);
- BinaryNode *pLast=pRoot;
- vector<BinaryNode*>::iterator ite1=v1.begin();
- vector<BinaryNode*>::iterator ite2=v2.begin();
- while(ite1!=v1.end() && ite2!=v2.end())
- {
- if(*ite1==*ite2)
- pLast=*ite1;
- ite1++;
- ite2++;
- }
- return pLast;
- }
0 0
- 算法面试——二叉树最低公共祖先LCA
- 面试经典(5)--二叉树最低公共祖先LCA
- 树——在二叉树中找到两个节点的最低公共祖先LCA
- 寻找二叉树两个节点的最低公共祖先(LCA)
- 最低公共祖先LCA
- 二叉树最低公共祖先
- LCA树两个节点最低公共祖先
- 编程算法 - 二叉树的最低公共祖先 代码(C)
- 【算法】【树】最近公共祖先LCA——Tarjan算法
- 树——树中两个节点的最低公共祖先LCA
- 树---求给定二叉树中两节点的最低公共祖先(LCA)
- 树---求二叉搜索树中两节点的最低公共祖先(LCA)
- 二叉搜索树的最低公共祖先
- 二叉树系列——两个节点的最低公共祖先
- 二叉树-最近公共祖先(LCA)
- 二叉树最近公共祖先(LCA)
- 二叉树的最近公共祖先LCA
- 树最低公共祖先
- spring容器启动之我见(二)
- Linux下修改终端提示符
- iOS开发 Coretext(文字排版)的基本用法
- Rotate Image 二维数组旋转90度
- 深度学习原理和实践
- 算法面试——二叉树最低公共祖先LCA
- 多线程和多进程的区别(小结)
- Anagrams 寻找相同的乱序的字母排列
- Python 关于 name main的使用 if __name__ == '__main__':
- 显示遮罩层并从屏幕上方滑出div
- oracle数据库导入与导出
- 【安全健行】(一):Hacker编程技能
- 2015.4.10学习mybatis
- 斯坦福大学机器学习第四课“逻辑回归(Logistic Regression)”