二叉树基础面试题1(力扣)

分治递归的思想

递归问题两个条件:1、子问题(一颗树分成3个部分:根+左子树+右子树)   2、返回条件(空树)

1.单值二叉树

题目描述:如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。

只有给定的树是单值二叉树时,才返回 true;否则返回 false

bool isUnivalTree(struct TreeNode* root){
    if(root==NULL)
    return true;

    if(root->left && root->left->val != root->val)
    return false;

    if(root->right && root->right->val != root->val)
    return false;

    return isUnivalTree(root->left) && isUnivalTree(root->right);
}

2.  二叉树的最大深度

题目描述:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

必须后序遍历方式

int maxDepth(struct TreeNode* root){
    if(root==NULL)
    return 0;

    int leftDepth = maxDepth(root->left);
    int rightDepth = maxDepth(root->right);

    return leftDepth > rightDepth ? leftDepth+1 : rightDepth +1;

}

3. 翻转二叉树

思想:1. 空   返回   2. 非空   交换左右孩子  继续翻转左右字数

struct TreeNode* invertTree(struct TreeNode* root){
    if(root==NULL)
    return NULL;

    struct TreeNode* tmp = root->right;
    root->right = root ->left;
    root->left =tmp;

    invertTree(root->left);
    invertTree(root->right);

    return root;

}

4. 检查两颗树是否相同

题目描述:给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

两颗树相同 1、两颗树根的结构和值相同 2、两颗树的左右子树相同

bool isSameTree(struct TreeNode* p, struct TreeNode* q){
    if(p==NULL && q==NULL)
    return true;

    //结构不相同
    if(p==NULL || q== NULL)
    return false;
    
    //p和q都不为空,值不同
    if(p->val != q->val)
    return false;

    //根的结构和值都相同,继续去判断左右子树s是否相同
    return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);

}

 5.对称二叉树

题目描述:给定一个二叉树,检查它是否是镜像对称的。

对称: 将左子树和右子树看作两棵树,比较左子树的左子树是否和右子树的右子树是否相同。 

bool _isSymmetric(struct TreeNode* p, struct TreeNode* q){
    if(p==NULL && q==NULL)
    return true;

    //结构不相同
    if(p==NULL || q== NULL)
    return false;
    
    //p和q都不为空,值不同
    if(p->val != q->val)
    return false;

    //根的结构和值都相同,继续去判断左右子树s是否相同
    return _isSymmetric(p->left,q->right) && _isSymmetric(p->right,q->left);
}

bool isSymmetric(struct TreeNode* root){
    if(root==NULL)
    return true;

    return _isSymmetric(root->left,root->right);

}

 

 

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