- 求二叉樹葉子節點的個數
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;
}