struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
//方式一:求每个节点的左右子树的高度,判断是不是平衡树,但是这种做法,效率太低,因为需要重复的遍历节点。
int High(TreeNode *root)
{
if(root == NULL)
return 0 ;
if(root->left == NULL && root->right == NULL)
return 1;
int size1 = High(root->left); //左子树的高度
int size2 = High(root->right); //右子树的高度.
return (size1>size2 ? size1+1:size2+1);
}
bool IsBalance(TreeNode *root)
{
if(root == NULL) //空树也是平衡树
return true;
int size1 = High(root->left);
int size2 = High(root->right);
if(size1 - size2 >1 || size1-size2 < -1)
{
return false;
}
return IsBalance(root->left) && IsBalance(root->right);
}
//方法二:利用后序遍历,每一个节点只要访问一次就好了。效率高
bool IsBalance2(TreeNode *root, int& size)
{
if(root == NULL)
{
size = 0;
return true;
}
int left = 0;
int right = 0;
int num = 0;
if(root->left)
{
IsBalance2(root->left, left);
}
if(root->right)
{
IsBalance2(root->right, right);
}
if((left -right > 1) || (left -right < -1)) //有一个根节点不是平衡点,整个树就不是平衡树。
return false;
num = left>right? left+1:right+1; //其中树中某一个根的高度
return true;
}
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
void Mirror(TreeNode *root)
{
if(root == NULL)
return ;
if(root->left == NULL && root->right == NULL)
return ;
swap(root->right, root->left);
Mirror(root->right);
Mirror(root->left);
}
- 一个m*n的矩阵,从左到右从上到下都是递增的,给一个数x,判断x是否在矩阵中。要求效率尽可能的高
bool Find(int target, vector<vector<int> > array)
{
if(array.size() == 0)
return false;
int rows= array.size();
int cols = array[1].size();
int row = 0;
int col = cols-1; //和右上角那个元素比较。
while(row < rows && col >= 0)
{
if(target < array[row][col])
{
col--;
}
else if(target > array[row][col])
{
row++;
}
else
return true;
}
return false;
}