算法题14 最低公共祖先
2016-02-02 21:49
316 查看
题目
给定一棵树,同时给出树中的两个结点(n1和n2),求它们的最低公共祖先。
分析1
最直观的想法是判断某节点的左子树和右子树如果分别包含一个节点n1或n2,也就是一边一个,那该节点就是他们的最低公共祖先。可以用递归的方式依次判断左右子树求解
代码
分析2
如果将根节点到给出的两个节点的路径找到,然后就可以求两条路径的最后一个公共节点了。查找一个节点的路径可以用递归的方式实现
给定一棵树,同时给出树中的两个结点(n1和n2),求它们的最低公共祖先。
分析1
最直观的想法是判断某节点的左子树和右子树如果分别包含一个节点n1或n2,也就是一边一个,那该节点就是他们的最低公共祖先。可以用递归的方式依次判断左右子树求解
代码
TreeNode* FirstCommonParent2(TreeNode* root,char a,char b) { if(root->value==a||root->value==b) { return root; } TreeNode* left,right; if (root->pLeft) { left=FirstCommonParent2(root->pLeft,a,b); } if (root->pRight) { right=FirstCommonParent2(root->pRight,a,b); } if (left&&right) { return root; } return (left)?left:right; }
分析2
如果将根节点到给出的两个节点的路径找到,然后就可以求两条路径的最后一个公共节点了。查找一个节点的路径可以用递归的方式实现
ListNode* PrintPath1(TreeNode* root,char c) { if (root->value==c) { ListNode* node=new ListNode(); node->value=c; node->pNext=NULL; return node; } ListNode* left=NULL; ListNode* right=NULL; if (root->pLeft) left=PrintPath1(root->pLeft,c); if (root->pRight) right=PrintPath1(root->pRight,c); if (left||right) { ListNode* node=new ListNode(); node->value=root->value; node->pNext=(left)?left:right; return node; } return NULL; }
void FirstCommonParent(TreeNode* root,char a,char b) { if(root==NULL) { return; } ListNode* list1=PrintPath1(root,a); ListNode* list2=PrintPath1(root,b); ListNode* node; while (list1&&list2&&list1->value==list2->value) { node=list1; list1=list1->pNext; list2=list2->pNext; } cout<<node->value<<endl; }
相关文章推荐
- 张正友标定论文翻译(1)
- ZooKeeper应用场景
- 如何实现JSP网页模板 JSP网页母版
- eclipse下使用github
- Java学习:Java字符串处理
- Android自定义View
- SVM:从数学上分析为什么优化cost function会产生大距离(margin)分类器
- bzoj 3160万径人踪灭
- 11gR2中安装完数据库软件手动建库过程
- (转)路由器处理ARP包过程(三层转发的过程)
- 理解Windows内核模式与用户模式
- 卡特兰数Catalan
- oracle 表连接 - hash join 哈希连接
- LeetCode Medium集锦
- J2EE重要的技术架构图
- 11 协议
- BUAA 1386-DZY的根 【贪心】
- sqlserver decimal转换成int类型的转换出错的另一种解决办法
- Oracle Active Data Guard VS Oracle GoldenGate
- 九度OJ 题目1019:简单计算器