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

代码中的二叉树长这个样子↓↓↓
在这里插入图片描述

找到该树中两个指定节点的最近公共祖先,有三种情况,如图:
在这里插入图片描述

import java.util.*;
import java.util.Queue;
//下面的所有求结点总数的,和求叶子结点个数的题,均使用的遍历方法是前序遍历
class Node{
    public char val;
    public Node left;//左孩子
    public Node right;//右孩子

    public Node(char val){
        this.val=val;
    }
}
public class BinaryTree {
    /*private static class Node {  //这些参数定义在在类方法外或者内都可以,只是有些需稍加修改
            char val;
            Node left;
            Node right;

            public Node(char val) {
                this.val = val;
            }
        }*/
    // 1、构造二叉树
    public Node buildTree(){
        Node A=new Node('A');
        Node B=new Node('B');
        Node C=new Node('C');
        Node D=new Node('D');
        Node E=new Node('E');
        Node F=new Node('F');
        Node G=new Node('G');
        Node H=new Node('H');
        A.left=B;A.right=C;B.left=D;B.right=E;//这里是构造二叉树的关键
        C.left=F;C.right=G;E.right=H;
        return A;
    }
    //找两个结点最近的公共祖先
    public Node lowstCommonAncestor(Node root,Node p,Node q){
        if(root==null){
            return null;
        }
        if(root==p||root==q){
            return root;
        }
        Node left=lowstCommonAncestor(root.left,p,q);
        Node right=lowstCommonAncestor(root.right,p,q);
        if(left!=null&&right!=null){
            return root;
        }else if(left!=null){
            return left;
        }else{
            return right;
        }
    }
    public static void main(String[] args) {
        BinaryTree binaryTree=new BinaryTree();
        Node root=binaryTree.buildTree();

        System.out.println("找两个结点最近的公共祖先:"+binaryTree.lowstCommonAncestor(root,root.left,root.right.left));//这里打印出的是地址,可推理该公共祖先是A
        System.out.println(root);//这个是根即A的地址,两者比较会发现是一致的
    }
}

执行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值