二叉树基础面试题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);

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值