day10之求二叉树叶子节点的个数+求二叉树第k层的节点个数+数组中超过一半的数字

  • 求二叉树叶子节点的个数
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
        val(x), left(NULL), right(NULL) {
        }
};


int  NumofLeaf(TreeNode *root)
{
    if(root == NULL)
        return 0 ;
    if(root->left == NULL && root->right == NULL)
        return 1;

    int size1 = NumofLeaf(root->left); //左子树的叶子节点个数。
    int size2 = NumofLeaf(root->right); //右子树的叶子节点个数。

    return size1+size2;

}

`

  • 求二叉树第k层的节点个数。
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
        val(x), left(NULL), right(NULL) {
        }
};


int  KNumOfTree(TreeNode *root, int k)
{
    if(root == NULL || k < 1)
        return 0;
    if(k == 1)
        return 1;
    int size1 = KNumOfTree(root->left, k-1); //左子树中第k-1层的节点个数。
    int size2 = KNumOfTree(root->right, k-1);

    return size1+size2;
}
  • 一个数组中有一个数字的次数超过了数组的一半,求出这个字符。如:int a[]={2,3,2,2,2,2,2,5,4,1,2,3},求出超过一半的数字是2。
//解法一:每次减去两个不同的人,如果有一个人的次数超过一半,最终留下的那个人肯定是这个人。
int MoreThanHalfNum_Solution(vector<int> numbers)
{
    if(numbers.empty())
        return INT_MIN;
    int cand = 0;
    int times = 0;

    for(int i = 0; i < numbers.size(); ++i)
    {
        if(times == 0 )
        {
            cand = numbers[i];
            times++;
        }
        else if(cand == numbers[i])
            times++;
        else
            times--;
    }
    //检查,确保一个数的出现的次数超过一半。
    int size = 0;
    for(int i = 0; i < numbers.size(); ++i)
    {
        if(numbers[i] == cand)
            size++;
    }
    if(size > numbers.size()/2 )
        return cand;
    return INT_MIN;

}

//解法二:
int Paration(vector<int> numbers, int low, int high)
{
    int pv = numbers[low];
    while(low < high)
    {
        while(low < high && numbers[high]>= pv)
            high--;
        swap(numbers[low], numbers[high]);

        while(low < high && numbers[low] <= pv)
            low++;
        swap(numbers[low], numbers[high]);
    }

    return low;
}


//如果一个数字出现超过数组一半,这个数组排序后中间那个元素一定是这个数字,我们只要找出这个中间元素即可。
int MoreThanHalfNum_Solution2(vector<int> numbers)
{
    if(numbers.size() == 0)
        return INT_MIN;
    int mid = numbers.size()/2;
    int low = 0;
    int high = numbers.size()-1;
    int index = Paration(numbers, low, high );
    while(index != mid)
    {
        if(index > mid)
        {
            high = index - 1;
            index = Paration(numbers, low, high);
        }
        else 
        { 
            low = index + 1;
            index = Paration(numbers, low, high);
        }
    }
    //检查
    int size = 0;
    int num = numbers[mid];
    for(int i = 0; i < numbers.size(); ++i)
    {
        if(numbers[i] == num)
            size++;
    }
    if(size > numbers.size()/2)
        return num;
    return INT_MIN;

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