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;

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