树---求给定二叉树中两节点的最低公共祖先(LCA)
来源:互联网 发布:centos安装intellij 编辑:程序博客网 时间:2024/05/29 17:31
一、问题描述
对于一颗二叉树,给定其中的两节点n1,n2,求出他们的最低公共祖先(Lowest Common Ancestor )。例如:
二、问题求解
利用递归思想。
(1)从root开始遍历,如果n1和n2中的任一个和root匹配,那么root就是LCA。(2) 如果都不匹配,则分别递归左、右子树,如果有一个 key(n1或n2)出现在左子树,并且另一个key(n1或n2)出现在右子树,则root就是LCA. (3)如果两个key都出现在左子树,则说明LCA在左子树中,否则在右子树。
三、实现代码
时间复杂度为O(n)
#include<iostream>using namespace std;typedef int KeyType;typedef struct BinaryTreeNode{ KeyType key; struct BinaryTreeNode *left; struct BinaryTreeNode *right;}BTNode, *BiTree;//创建二叉树节点BTNode *CreateBTNode(KeyType key){ BTNode *node = new BTNode; node->key = key; node->left = node->right = NULL; return node;}//对于给定的树中两节点n1和n2,返回两者lca的指针BTNode *findLCA(BTNode *root, KeyType n1, KeyType n2){ if(root == NULL) return NULL; //(1)n1,n2中的一个是另一个的父节点,即为LCA if(root->key==n1 || root->key==n2) return root; //(2)n1,n2没有父子关系,这时又存在两种情况: //case1:同在一个子树。case2:分别在两个子树。 BTNode *left_lca=findLCA(root->left, n1, n2); BTNode *right_lca=findLCA(root->right, n1, n2); //都为真,说明两边子树都能找到n1或n2,这是case2的情况 if(left_lca && right_lca) return root;//当n1,n2分别在两个子树时lca即为根节点 //case1的情况 return (left_lca != NULL)?left_lca:right_lca;}int main(){ BTNode *root = CreateBTNode(1); root->left = CreateBTNode(2); root->right = CreateBTNode(3); root->left->left = CreateBTNode(4); root->left->right = CreateBTNode(5); root->right->left = CreateBTNode(6); root->right->right = CreateBTNode(7); cout <<"LCA(4, 5): "<<findLCA(root, 4, 5)->key<<endl; cout <<"LCA(4, 6): "<<findLCA(root, 4, 6)->key<<endl; cout <<"LCA(3, 4): "<<findLCA(root, 3, 4)->key<<endl; cout <<"LCA(2, 4): "<<findLCA(root, 2, 4)->key<<endl; return 0;}
结果:
LCA(4, 5): 2LCA(4, 6): 1LCA(3, 4): 1LCA(2, 4): 2Process returned 0 (0x0) execution time : 0.279 sPress any key to continue.
0 0
- 树---求给定二叉树中两节点的最低公共祖先(LCA)
- 树---求二叉搜索树中两节点的最低公共祖先(LCA)
- 寻找二叉树两个节点的最低公共祖先(LCA)
- 给定一棵二叉树。求两个树节点的最低公共祖先
- 由浅入深:求给定两个树节点的最低公共祖先(二叉树、普通树结构)JAVA实现
- 求二叉树中两个节点的最低公共祖先
- 求二叉树中两个节点的最低公共祖先
- LCA树两个节点最低公共祖先
- 树——在二叉树中找到两个节点的最低公共祖先LCA
- coding - 求二叉树中两节点最低公共祖先
- 求二叉树中两个节点的最小公共祖先(LCA)
- 求二叉树的两个节点的最低公共祖先节点
- 求二叉树中两个节点p,q的最低公共祖先节点
- 求二叉树中两个节点的最低公共祖先节点
- 求二叉树中两个节点的最低公共祖先节点
- 面试经典(5)--二叉树最低公共祖先LCA
- 【真题 腾讯】满二叉搜索树求三个节点的最低公共祖先
- 二叉树中查找两个节点的最低公共祖先
- Excel 宏实现图片按比例缩放
- jquery validate 插件:(2)简单示例
- 菜鸟好文推荐(二十)——14个最佳的HTML/CSS设计和开发框架
- springMVC上传文件
- 菜鸟好文推荐(二十一)——11款最棒的Linux数据恢复工具
- 树---求给定二叉树中两节点的最低公共祖先(LCA)
- 菜鸟好文推荐(二十二)——让老板开心的程序员不是好程序员
- UITableViewCell加载时的简单动画效果
- Mysql的发行版本小结
- 最佳缝合线算法(图像融合)
- 递归输出char数组的所有排列
- jquery validate 插件:(3)校验规则
- C++实现单链表
- WebMVC框架 之 SpringMVC