数据结构与算法26

Leecode236

题目

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

分析

这道题,题目描述佷短,但是本体难度不小。 本体条件是在给定的树中找出两个节点的公共节点。没有特别要求。由定义分析可知:一个树中每个结点要么是p的祖先要么是q的祖先要么是p与q的共同祖先要么啥都不算的。所以可以想到使用递归的方法求出从根节点开始找其左右子树判断该子树的根是否为p或者q的祖先。

解法

根据分析出方法,可以想到一种递归的思路:若该树根节点是null则其属于既不是p的祖先也不是q的祖先。若该树根节点为左节点或者右节点,则该点就是其祖先。若该根的左右结点分别是p,q的祖先则该根就为最近的共同祖先。若该根结点的一个子节点为p或q的祖先另一个啥也不是则该根结点就同样也是p或q的祖先。
由此得到代码:

public class Solution 
{    
	public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q)     	
	{        
		if(root == null)        
		{            
			return null;        
		}        
		if(root.val == p.val||root.val == q.val)        
		{            
			return root;        
		}        
		TreeNode l=LowestCommonAncestor(root.left,p,q);        
		TreeNode r=LowestCommonAncestor(root.right,p,q);        
		if(l==null)        
		{            
			return r;        
		}        
		if(r==null)        
		{            
			return l;        
		}        
		return root;    
	}
}

代码就是按照上面的思路将各个判别的条件区分写出。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值