算法|二叉树 二叉树最近公共祖先
给定一颗二叉搜索树 2个节点,求2个节点的最近公共祖先
思路:
- 如果2个节点均大于根节点的值,那递归在右子树寻找
- 如果2个节点均小于根节点的值,那递归在左子树寻找
- 如果刚好一大一小于根节点的值,那么返回该根节点
Node* Get(Node* root,Node* p1,Node* p2)
{
if(root==NULL || p1==NULL || p2==NULL)//指针检查
{
return NULL;
}
int data_root=root->data;
int data_p1=p1->data;
int data_p2=p2->data;
if(data_p1<=data_root && data_p2<=data_root)
{
return Get(root->left);
}
else if(data_p1>data_root && data_p2>data_root)
{
return Get(root->right);
}
else
{
return root;
}
}
若是一般的普通二叉树,求解其最近的公共祖先。(保证测试数据合法)
思路:采取前序遍历的方式,对于当前的节点,分别返回左右子树包含的目标节点数
【算法|二叉树 二叉树最近公共祖先】若left_num==right_num=1即当前节点的左右子树各含有一个目标节点,那么当前节点为最近公共祖先。
其他一般情况下,返回当前树的目标节点数,若当前节点为目标节点,那么返回1
int dfs(Node* now,node* one, node* two,node*& res)
{
if(now==one || now==two)
{
return 1;
}
int left_count=0,right_count=0;
if(now->left!=NULL)
left_count=dfs(now-left,one,two,res);
if(left_count==2)//及时返回,一旦找到结果,那么立即返回
return 2;
if(now->right!=NULL)
right_count=dfs(now->right,one,two,res);
if(left_count==right_count==1) //刚好左右各有一个那么结果为当前节点
{
res=now;
return 2;
}
return left_count+right_count;
}
推荐阅读
- 画解算法(1.|画解算法:1. 两数之和)
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- Guava|Guava RateLimiter与限流算法
- java中如何实现重建二叉树
- 一个选择排序算法
- 种树郭橐驼传(文言句式+古今异义+词类活用+通假字)
- SG平滑轨迹算法的原理和实现
- 白杨树
- 《算法》-图[有向图]
- 08黑龙江迟淑荣弯柳树网络学院第五期学习赵宗瑞老师主讲的(传统文化与身心健康)教育体系心得体会