• 30 Day Challenge Day 7 | Leetcode 235. Lowest Common Ancestor of a Binary Search Tree


    题解

    方法:DFS Search

    找两个节点的最低祖宗节点,想到用深度优先搜索,先找到从根节点到达该节点的路径,然后遍历两条路径,找到最低的共同祖宗节点。可以通过测试。

    然后后来发现我把问题复杂化了,忽略了题目中的条件,“平衡二叉树”,也就是说,节点是有顺序的,而我完全没有用上。

    class Solution {
    public:
        TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
            vector<TreeNode*> arr1, arr2, ret1, ret2;
            search(root, p, arr1, ret1);
            search(root, q, arr2, ret2);
    
            int i = 0;
            while(i < ret1.size() && i < ret2.size() && ret1[i] == ret2[i]) {
                i++;
            }
            if(i > 0) i--;
    
            return ret1[i];
        }
        
        void search(TreeNode* node, TreeNode* t, vector<TreeNode*>& arr, vector<TreeNode*>& ret) {
            if(!node) return;
    
            arr.push_back(node);
    
            if(node == t) {
                for(auto n : arr) {
                    ret.push_back(n);
                }
                return;
            }
    
            if(node->left) search(node->left, t, arr, ret);
            if(node->right) search(node->right, t, arr, ret);
    
            arr.pop_back();
        }
    };
    

    方法:平衡二叉树搜索

    这里while的判断条件设置地很巧妙,只需要判断与root的值的差是不是同为正或同为负,那么就可以知道,p和q是不是都在root左边或者右边。如果不是,无论是等于0的情况还是,小于0的情况,都找到了共同祖先。

    class Solution {
    public:
        TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
            while((root->val - p->val)*(root->val - q->val) > 0) {
                root = (root->val > p->val) ? root->left : root->right;
            }
            return root;
        }
    };
    
  • 相关阅读:
    HTTP RFC解析
    Symfony框架的笔记
    Swoole学习总结1
    PHP Socket 学习笔记一
    Js解决解除多次Ajax请求的事件
    Python 操作串口
    python 实现微信自动回复和好友签名分析
    杂谈1
    Vue.js 功课1
    微信API demo
  • 原文地址:https://www.cnblogs.com/casperwin/p/13649411.html
Copyright © 2020-2023  润新知