剑指offer-37.树中两个节点的最低公共祖先(未完成)(326)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_38332722/article/details/100558410

37.树中两个节点的最低公共祖先(未完成)(326)

  • 题目描述:输入一棵树的根节点,输入两个被观察节点,求这两个节点的最低(最近)公共祖先。

  • 如果是一颗二叉搜索树:两个结点的最近根结点的值位于两个结点的值之间。

    (1)如果根结点的值大于两个结点的值,最低公共父结点在当前根结点的左子树中。

    (2)如果根结点的值小于两个结点的值,最低公共父结点在当前根结点的右子树中。

    (3)如果根结点的值位于两个结点值之间,则该结点为两个结点的最低公共父结点。

    package _37.树中两个节点的最低公共祖先;
    
    public class CommonParentInBTree {
    
    	/**
    	 * 1.如果为一颗二叉搜索树
    	 * @param node1
    	 * @param node2
    	 * @return
    	 */
    	public static TreeNode getLastedParent(TreeNode root,TreeNode node1,TreeNode node2){
    		if(root == null || node1 == null || node2 == null) return null;
    		
    		TreeNode cur = root;
    		while(cur != null){
    			//如果根结点的值大于两个结点的值,最低公共父结点在当前根结点的左子树中。
    			if(cur.val > node1.val && cur.val >node2.val){
    				cur = cur.left;
    			}
    			//如果根结点的值小于两个结点的值,最低公共父结点在当前根结点的右子树中。
    			if(cur.val < node1.val && cur.val < node2.val){
    				cur = cur.right;
    			}
    			//如果根结点的值位于两个结点值之间,则该结点为两个结点的最低公共父结点。
    			else{
    				return cur;
    			}
    		}
    		return null;
    	}
    	/**
    	 *         5
    	 *       /   \
    	 *      3     7
    	 *     / \   / \
    	 *    2   4 6   8
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		TreeNode root = new TreeNode(5);
            root.left = new TreeNode(3);
            root.left.left = new TreeNode(2);
            root.left.right = new TreeNode(4);
            root.right = new TreeNode(7);
            root.right.left = new TreeNode(6);
            root.right.right = new TreeNode(8);
            TreeNode parent = getLastedParent(root,root.left.left, root.right.left);
            System.out.println(parent);
    	}
    }
    class TreeNode {
    	int val = 0;
    	TreeNode left = null;
    	TreeNode right = null;
    
    	public TreeNode(int val) {
    		this.val = val;
    	}
    
    	@Override
    	public String toString() {
    		return "TreeNode [val=" + val + "]";
    	}
    }
    
  • 如果是一颗普通的二叉树,但是结点中有指向父结点的指针。

    ​ 如果结点中有指向其父结点的指针,就访问两个结点的父结点,如果不相同,则继续访问其父结点。直到找到相同的父结点为止。

    ​ 题目转化为查找两个单链表的第一个相交的结点。

  • 只是一颗普通的二叉树,没有父结点。

猜你喜欢

转载自blog.csdn.net/qq_38332722/article/details/100558410