当前位置 博文首页 > 中流击水,浪遏飞舟:中序&&递归&&剑指 Offer 6

    中流击水,浪遏飞舟:中序&&递归&&剑指 Offer 6

    作者:[db:作者] 时间:2021-08-26 12:41

    1.中序遍历+循环判断(结合二叉搜索树那题,自己写的代码

    昨天的二叉搜索树:
    递归&&迭代&&剑指 Offer 68 - I. 二叉搜索树的最近公共祖先

    依旧按照三种情况判断两个结点在左孩子、右孩子、异侧的情况,不过判断操作单独写在一个void dfs()函数里面。解答过程中,画图分析代码错误最后写出来,这个有冗余操作,每一次都要判断两个结点在哪一边(调用dfs()函数),增加了时间复杂度。

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        int pnum,qnum,count;
        void dfs(TreeNode*root,int rnum){	//判断p,q位于左孩子、右孩子、异侧
            if(!root)   return ;
            dfs(root->left,rnum);
            if(root->val==rnum)   return;	//剪枝操作,只需要判断左边有无p,q,中序遍历
            if(root->val==pnum||root->val==qnum)    count+=1;
            dfs(root->right,rnum);
        }
        TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
            pnum=p->val;
            qnum=q->val;
            while(root){
                count=0;
                dfs(root,root->val);
               // cout<<root->val<<" "<<"count="<<count<<endl;
                if(root!=p&&root!=q){
                    if(count==2)    root=root->left;
                    else if(count==0)  root=root->right;
                    else    break;
                }
                else break;
            }
            return root;
        }
    };
    

    2.递归(参考大佬的解法,极大优化时间复杂度,减少冗余操作

    附上大佬力扣题解:
    剑指 Offer 68 - II. 二叉树的最近公共祖先(DFS ,清晰图解)

    递归:(1)终止条件;(2)递归工作;(3)返回值。

    这里返回值有四种情况,原来直接返回结点就好了。

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

    刷完剑指offer的简单题了。

    发完昨晚那篇blog,积分达到400,博客等级升到3,换了个皮肤,增加了"K神"的标签(狗头

    cs