- 求二叉树叶子节点的个数
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;
}