代码随想录算法训练营第二十一天|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先

530.二叉搜索树的最小绝对差

public class Solution {
    public int GetMinimumDifference(TreeNode root) {
        var q=new Queue();
        q.Enqueue(root);
         var an=new List();
        while(q.Count!=0)
        {
            var size=q.Count;
            while(size!=0)
            {
                size--;
                var cur=q.Dequeue();
                an.Add(cur.val);
                if(cur.left!=null)
                {
                    q.Enqueue(cur.left);
                }
                if(cur.right!=null)
                {
                    q.Enqueue(cur.right);
                }
            }
        }
        int []ans=an.ToArray();
        Array.Sort(ans);
        var a=int.MaxValue;
        for(int i=1;i

先层序遍历将每个节点值加入到数组里面,再将数组排序,然后一次求相邻两个元素的差,取最小值返回即可。

501.二叉搜索树中的众数

public class Solution {
    public int[] FindMode(TreeNode root) {
        var q=new Queue();
        q.Enqueue(root);
         var an=new List();
        while(q.Count!=0)
        {
            var size=q.Count;
            while(size!=0)
            {
                size--;
                var cur=q.Dequeue();
                an.Add(cur.val);
                if(cur.left!=null)
                {
                    q.Enqueue(cur.left);
                }
                if(cur.right!=null)
                {
                    q.Enqueue(cur.right);
                }
            }
        }
        int []ans=an.ToArray();
        Array.Sort(ans);
        Dictionary dic=new Dictionary();
        var max=0;
        var re=new List();
        foreach(int num in ans)
        {
            if(dic.ContainsKey(num))
            {
                dic[num]++;
            }else
            {
                dic[num]=1;
            }
            if(dic[num]>max)
            {
                re.Clear();
                max=dic[num];
                re.Add(num);
            }else if(dic[num]==max)
            {
                re.Add(num);
            }
        }     
        return re.ToArray();
    }
}

先层序遍历将每个节点的值加入到数组里并排序,然后遍历数组将每个元素加入到字典里,比较字典里的Value值,大的那个加入到列表里,如果有更大的,就把列表清空然后重新加入,如果有和和最大值相同的Value直接将对应Key加入列表无需清空,最终将列表转成数组返回即可。

236.二叉树的最近公共祖先

public class Solution {
    public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null)
        {
            return null;
        }
        if(root==p||root==q)
        {
            return root;
        }
        var left=LowestCommonAncestor(root.left,p,q);
        var right=LowestCommonAncestor(root.right,p,q);
        if(left!=null&&right!=null)
        {
            return root;
        }
        if(left==null&&right!=null)
        {
            return right;
        }
        else if(right==null&&left!=null)
        {
            return left;
        }else
        return null;

    }
}

如果根节点为空直接返回空即可,如果当前节点等于P或Q直接返回当前节点,这是终止条件。采取后序遍历的方法(左右中),左右分别取递归,然后中节点处判断两边是否为空(即是否找到了P或Q)如果是则中节点返回,是最近的公共祖先。如果左边递归结果为空,右边不为空则返回右侧结果,同理右为空左不为空返回左侧结果,如果都不满足就返回Null。

你可能感兴趣的:(算法,c#,leetcode,数据结构)