劍指Offer對答如流系列 - 樹中兩個結點的最低公共祖先

面試題68:樹中兩個結點的最低公共祖先

一、題目描述

輸入兩個樹結點,求它們的最低公共祖先。

二、問題分析

這屬於劍指Offer面試案例中探討的一道問題。

在解答之前要先和面試官確定是否爲二叉樹,如果是,還要確定是否爲二叉搜索樹,是否有父引用,或者僅僅是普通二叉樹。

案例中確定樹爲二叉樹,不過樹可能有兩種,一種是二叉搜索樹,一種是普通樹。
二叉樹節點的定義

	public class Node {
        int val = 0;
        Node left = null;
        Node right = null;

        public Node(int val) {
            this.val = val;
        }
    }

如果樹爲二叉搜索樹時,最低公共祖先結點的大小在兩個樹結點大小的中間。

如果樹爲普通樹時,使用遍歷將子結點的信息往上傳遞。在左右子樹中進行查找是否存在兩個樹結點,如果兩個樹結點分別在左右子樹上,說明該根結點就是它們的最低公共祖先。

三、問題解答

二叉樹

    // 二叉搜索樹
    public Node getLowestCommonParentBST(Node root,Node node1,Node node2) {
        while(true) {
            if(root==null)
                return null;
            if(root.val<node1.val && root.val<node2.val) {
                root=root.right;
            } else if(root.val>node1.val && root.val>node2.val) {
                root=root.right;
            } else {
                return root;
            }
        }
    }

普通二叉樹

    // 普通二叉樹 將下面結點的信息利用遞歸s往上傳遞
    public Node getLowestCommonParent(Node root, Node node1, Node node2) {
        if(root==null || root== node1 || root== node2) {
            return root;
        }
        Node left=getLowestCommonParent(root.left, node1, node2);
        Node right=getLowestCommonParent(root.right, node1, node2);
        return left==null? right:(right==null? left:root);
    }
發佈了194 篇原創文章 · 獲贊 3472 · 訪問量 53萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章