二叉树最近公共祖先代码 java 2022.03.10

最近公共祖先代码



灵魂三问
1)这个的函数是做什么的?
	--函数功能
  -- 正向逻辑推理
2)base case是什么
3)递归后做什么 
	--反向逻辑推理


具体

1)这个函数是做什么的?
  -- 求出来二叉树节点的最近公共祖先

 2)base case是什么?
 	--  root == null时,返回 null
 	--p == root || q == root; 返回 root

 	3)得到递归结果后,做什么
 		--left 和 right均不为空,则 root则为最近公共祖先
 		-- left 和	right为空,则 无最近公共祖先
 		-- left 和	right有一个不为空,则 这个不为空的节点就是 两者的最近公共祖先


 框架代码
 
 public TreeNode getLeasterAncestor(TreeNode root, TreeNode p, TreeNode q){
 		// 框架
 		TreeNode left = getLeasterAncestor(root.left, p, q);
 		TreeNode rigth = getLeasterAncestor(root.right, p, q);
 }	


具体
	public TreeNode getLeasterAncestor(TreeNode root, TreeNode p, TreeNode q){
			if(root == null){
				return null;
			}

			if(p == root || q == root){
				return root;
			}

	 		// 框架(可画示意图,感受下 这个后序遍历的过程,递归调用,及有值逐层返回的过程)
	 		TreeNode left = getLeasterAncestor(root.left, p, q);
	 		TreeNode rigth = getLeasterAncestor(root.right, p, q);

	 		// 在各自的左右分支上
	 		if(left != null && right != null){
	 			return root;
	 		}

	 		// 左右分支上遍历均没有找到 p和 q,所以返回 null,没有最近公共祖先

	 		 if(left == null && right == null){
	 			return null;
	 		}

	 		// 在上边的情况外的其他情况时,说明是在遍历到一个p或q节点,另一个节点是其子节点,所以直接返回遍历到的不为null的节点
	 		return left != null ? left : right;
	 }	

后序遍历后的3种情况示意图

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java二叉树最近公共祖先可以通过递归来解决。首先,我们需要定义一个TreeNode类表示二叉树的节点,其中包含值和左右子节点的引用。下面是一个示例代码: ```java class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int val) { this.val = val; } } ``` 接下来,我们可以实现一个递归函数来找到最近公共祖先: ```java public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { // 判断当前节点是否为空或者等于p或q if (root == null || root == p || root == q) { return root; } // 在左子树中寻找最近公共祖先 TreeNode left = lowestCommonAncestor(root.left, p, q); // 在右子树中寻找最近公共祖先 TreeNode right = lowestCommonAncestor(root.right, p, q); // 如果左子树和右子树都找到了最近公共祖先,则当前节点就是最近公共祖先 if (left != null && right != null) { return root; } // 如果只有左子树找到了最近公共祖先,则返回左子树的结果 if (left != null) { return left; } // 如果只有右子树找到了最近公共祖先,则返回右子树的结果 if (right != null) { return right; } // 如果左右子树都没有找到最近公共祖先,则返回null return null; } ``` 这个递归函数的基本思路是: - 当前节点为空或者等于p或q时,直接返回当前节点; - 在左子树中寻找最近公共祖先; - 在右子树中寻找最近公共祖先; - 如果左子树和右子树都找到了最近公共祖先,则当前节点就是最近公共祖先; - 如果只有左子树找到了最近公共祖先,则返回左子树的结果; - 如果只有右子树找到了最近公共祖先,则返回右子树的结果; - 如果左右子树都没有找到最近公共祖先,则返回null。 你可以调用这个函数来找到二叉树中任意两个节点的最近公共祖先
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值