牛客网简单题二叉树(训练2)

题目1(判断是不是平衡二叉树)

牛客网简单题二叉树(训练2)_第1张图片

class Solution {
public:
    int depth(TreeNode *root){
        if(root==NULL)
            return 0;
        int left=depth(root->left);
        int right=depth(root->right);
        return (left>right)?left+1:right+1;
    }
    bool IsBalanced_Solution(TreeNode* pRoot) {
         if(pRoot==NULL)
             return true;
        int left=depth(pRoot->left);
        int right=depth(pRoot->right);
        if(left-right>1||left-right<-1)
            return false;
        //同时左右子树必须是平衡的~
        //这道题把递归用的很好~,巧用递归真的可以解决好多问题
        return IsBalanced_Solution(pRoot->left)&&IsBalanced_Solution(pRoot->right);
    }
};

这道题学会的一个是将以后的知识进行应用,自己会求最大深度,但是就是没会双层利用,判断每一个二叉树的左右子树的深度并进行判断是不是平衡二叉树

题目2(二叉搜索树的最近公共祖先)

牛客网简单题二叉树(训练2)_第2张图片

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param root TreeNode类
     * @param p int整型
     * @param q int整型
     * @return int整型
     */
    vector<int> getpath(TreeNode *root,int target){
        vector<int> path;
        TreeNode *node=root;
        while(node->val!=target){
            path.push_back(node->val);
            if(node->val>target)
                node=node->left;
            //懂了这里,如果都写if的话判断完上面的会进行赋值,再进行判断下面的就会出现问题
            //所以谨慎用多个if进行判断的时候~
            else
                node=node->right;
        }
        path.push_back(node->val);
        return path;
    }
    int lowestCommonAncestor(TreeNode* root, int p, int q) {
        // write code here
        vector<int> path_p;
        vector<int> path_q;
        path_p=getpath(root,p);
        path_q=getpath(root, q);
        int res;
        for(int i=0;i<path_p.size()&&i<path_q.size();i++){
            if(path_p[i]==path_q[i])
                res=path_p[i];
            else
                break;
        }
        return res;
    }
};

这道题分别求路径,然后再重新遍历找到最后一个相同的点是我没想到的,因为忽略了二叉搜索树的本质即找到一个值的路径只能有一条~,这点自己没想出来
!!!摆出一个大神的解法,真的佩服~(代码简化任重而道远,先学会思路吧)

public class Solution {
    public int lowestCommonAncestor (TreeNode root, int p, int q) {
 
        // 随便给2个数,利用二叉搜索树的性质:
         
        // 如果两个值都小于根节点,说明祖先在左子树一侧
        if(p<root.val && q<root.val)
            return lowestCommonAncestor(root.left,p,q);
        // 如果两个值都大于根节点,说明祖先在右子树一侧
        if(p>root.val && q>root.val)
            return lowestCommonAncestor(root.right,p,q);
        // 剩最后一种情况:如果根节点的值恰好在两个给定值之间,这个根节点就是最近的公共祖先
        return root.val;
    }
}

你可能感兴趣的:(数据结构算法学习,leetcode,算法,职场和发展)