day12之判断一棵二叉树是否是平衡二叉树+求一颗二叉树的镜像+判断一个数在二维数组中是否存在

  • 判断一棵二叉树是否是平衡二叉树
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;
}

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/hj605635529/article/details/76039884
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞