面試題68 - I. 二叉搜索樹的最近公共祖先

題目來源

面試題68 - I. 二叉搜索樹的最近公共祖先

235. 二叉搜索樹的最近公共祖先

題目描述

在這裏插入圖片描述

題目解析

遞歸

在這裏插入圖片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null || root == p || root == q){
            return root;
        }
        
        if (root.val < p.val && root.val < q.val){
            return lowestCommonAncestor(root.right, p, q);
        }
        
        if (root.val > p.val && root.val > q.val){
            return lowestCommonAncestor(root.left, p, q);
        }
        
        
        return root;
    }

}

深度優先搜索

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null || root == p || root == q){
            return root;
        }

        // 找到p的路徑:
        TreeNode treeNode = root;
        List<TreeNode> list = new ArrayList<>();
        while (treeNode != null){
            list.add(treeNode);
            if (treeNode.val < p.val){
                treeNode = treeNode.right;
            }else if (treeNode.val > p.val){
                treeNode = treeNode.left;
            }else {
                break;
            }
        }

        // p、q 爲不同節點且均存在於給定的二叉搜索樹中。
        treeNode = root;
        List<TreeNode> list1 = new ArrayList<>();
        while (treeNode != null){
            list1.add(treeNode);
            if (treeNode.val < q.val){
                treeNode = treeNode.right;
            }else if (treeNode.val > q.val){
                treeNode = treeNode.left;
            }else {
                break;
            }
        }

        TreeNode pre = null;
        int size = Math.min(list.size(), list1.size());
        for (int i = 0; i < size; i++){
            if (list.get(i).val == list1.get(i).val){
                pre = list.get(i);
            }else{
                return pre;
            }
        }



        return pre;
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章