二叉树oj联习

判断是否为平衡二叉树

定义

oj题目

采用递归的思想

在gaodu函数中算出左子树的高度和右子树的高度

相减进行比较

再用递归遍历左右子树

依次算出每个结点的左右子树高度比较,只要有一个不符合条件则不为平衡二叉树

代码展示

int gaodu(struct TreeNode* a)
{
    if(a==NULL)
    {
        return 0;
    }
    int la=gaodu(a->left);
    int ra=gaodu(a->right);
    return la>ra?1+la:1+ra;
}
bool isBalanced(struct TreeNode* root) {
    int n=0;
    if(root==NULL)
    {
        return true;
    }
    int l=gaodu(root->left);
    int r=gaodu(root->right);
    int a=l-r;
    if(!((a==-1)||(a==0)||(a==1)))
    {
        return false;
    }
    if(!isBalanced(root->left))
    {
        return false;
    }
    if(!isBalanced(root->right))
    {
        return false;
    }
    return true;
}

N0 N1 N2关系 

 

必有N0=N2+1

翻转二叉树

oj题目

递归遍历二叉树翻转左右子树即可

代码展示

 void jiaohuan (struct TreeNode* a)
 {
    struct TreeNode* x;
    x=a->left;
    a->left=a->right;
    a->right=x;
 }
struct TreeNode* invertTree(struct TreeNode* root) {
    if(root==NULL)
    {
        return 0;
    }
    jiaohuan(root);
    invertTree(root->left);
    invertTree(root->right);
    return root;
}

另一颗树的子树

oj题目

same函数递归的方法判断两数是否相同

在issub函数中递归root二叉树调用same即可

代码展示

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p==NULL&&q==NULL)
    {
        return true;
    }
    if((p==NULL)||(q==NULL))
    {
        return false;
    }
    if(p->val==q->val)
    {
    }
    else
    {
        return false;
    }
    if(isSameTree(p->left,q->left)&&isSameTree(p->right,q->right))
    {
        return true;
    }
    else{
    return false;
    }
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
if(root==NULL)
{
    return false;
}
if(isSameTree(root,subRoot))
{
    return true;
}
else{
if(isSubtree(root->left,subRoot)
||isSubtree(root->right,subRoot))
{
    return true;
}
return false;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值