劍指 Offer 68 - I. 二叉搜索樹的最近公共祖先

題目:

劍指 Offer 68 - I. 二叉搜索樹的最近公共祖先
235. 二叉搜索樹的最近公共祖先
在這裏插入圖片描述

題解:

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

1. 題解一:迭代

在這裏插入圖片描述
在這裏插入圖片描述

2. 題解二:遞歸

在這裏插入圖片描述

代碼:

1. 代碼一:迭代

public class 面試題68_1 {

    // 方法1:迭代
    public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        while(root != null) // 當節點 root 爲空時跳出
        {
            if(root.val < p.val && root.val < q.val) // p,q 都在 root 的右子樹中
            {
                root = root.right; // 遍歷至右子節點
            }
            else if(root.val > p.val && root.val > q.val) // p,q 都在 root 的左子樹中
            {
                root = root.left; // 遍歷至左子節點
            }
            else
            {
                break; // 否則,說明找到了 最近公共祖先 ,跳出。
            }
        }
        return root; // 返回最近公共祖先 root
    }

    public static void main(String[] args) {
        Integer nums[] = { 6, 2, 8, 0, 4, 7, 9, null, null, 3, 5 };
        TreeNode root = ConstructTree.constructTree(nums);
        TreeOperation.show(root);

        System.out.println("***************************************");

        TreeNode p1 = new TreeNode(2);
        TreeNode q1 = new TreeNode(8);
        TreeNode res1 = lowestCommonAncestor(root, p1, q1);
        System.out.println(res1.val);

        System.out.println("***************************************");

        TreeNode p2 = new TreeNode(2);
        TreeNode q2 = new TreeNode(4);
        TreeNode res2 = lowestCommonAncestor(root, p2, q2);
        System.out.println(res2.val);
    }
}

2. 代碼二:遞歸

public class 面試題68_1 {

    // 方法2:遞歸
    public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root.val < p.val && root.val < q.val)
        {
            return lowestCommonAncestor(root.right, p, q); // 當p,q都比root大時,根據二叉搜索樹的性質,則p和q的公共祖先一定在root的右子樹上
        }
        if(root.val > p.val && root.val > q.val)
        {
            return lowestCommonAncestor(root.left, p, q); //同理,當p,q都比root小時,則去root的左子樹上找。
        }
        // 如果p或q等於root了,則說明這個等於的節點就是公共祖先
        //否則則p和q是在root的兩邊,則root是公共祖先
        return root;
        // 下面幾句可以合併成 return root;
        // if(p.val == root.val)
        // {
        //     return p;
        // }
        // else if(q.val == root.val)
        // {
        //     return q;
        // }
        // else
        // {
        //     return root;
        // }
    }

    public static void main(String[] args) {
        Integer nums[] = { 6, 2, 8, 0, 4, 7, 9, null, null, 3, 5 };
        TreeNode root = ConstructTree.constructTree(nums);
        TreeOperation.show(root);

        System.out.println("***************************************");

        TreeNode p1 = new TreeNode(2);
        TreeNode q1 = new TreeNode(8);
        TreeNode res1 = lowestCommonAncestor(root, p1, q1);
        System.out.println(res1.val);

        System.out.println("***************************************");

        TreeNode p2 = new TreeNode(2);
        TreeNode q2 = new TreeNode(4);
        TreeNode res2 = lowestCommonAncestor(root, p2, q2);
        System.out.println(res2.val);
    }
}

參考:

  1. 面試題68 - I. 二叉搜索樹的最近公共祖先(迭代 / 遞歸,清晰圖解)
  2. 非遞歸算法
  3. 【Java】遞歸與非遞歸【兩種解法】
  4. 二叉搜索樹的最近公共祖先
  5. Java(遞歸) 三行代碼
  6. 【5月第4篇題解】分類討論 遞歸
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章