Leetcode-965.单值二叉树

二叉树遍历与单值判断:递归与左右子树的巧妙应用
本文探讨了如何利用递归和二叉树特性判断单值二叉树,通过两种不同的遍历方法,一是逐节点比较,二是利用根节点的子树单值性。作者展示了如何通过递归深入子树直至找到矛盾,揭示了巧妙的递归结构和左右子树关联的判断逻辑。

题目如下
在这里插入图片描述

节点遍历

作为二叉树,我们可以采用递归的方法去遍历每一个节点。
我首先想到的是,使用一个函数去递归每个节点,再各个相互比较,使用一个flag去判断是否属于单值二叉树。

void order(struct TreeNode* root,int* flag)
{
    if(root==NULL)
        return ;
    if(root->left!=NULL&&root->val!=root->left->val)
    {
        *flag=0;
    }
    order(root->left,flag);   
    if(root->right!=NULL&&root->val!=root->right->val)
    {
        *flag=0;
    }
    order(root->right,flag);
}
bool isUnivalTree(struct TreeNode* root){
    int flag=1;
    order(root,&flag);
    if(flag==0)
        return false;
    return true;
}

我以一个flag作为判断的标准,只要出现一个节点不一样,那么就可以flag置0,也就是可以直接判断不是单值二叉树。这个方法跟偏向于对于递归不太熟的,像我一样的小白。
我并未充分利用二叉树左右子树的特性,反而是依次遍历每个节点,让节点右她的左右节点去比较。。每次都只考虑一个小树
在这里插入图片描述
只比较这个小树之间的值。
也就是每次递归判断的都是这个小树。

左右子树

可以使用另外一种方法思路。
对于根节点而言,要满足单值二叉树,则必须要满足,根节点的左右子树也满足单值二叉树。
在这里插入图片描述
然后其根节点同时也要满足单值二叉树,也就是与其左右孩子相比是否相等。如果不相等则返回false.其次,每次都要满足其左右子树也是单值二叉树。也就是意味着,他们的返回值都是true.

bool isUnivalTree(struct TreeNode* root){
   if(root==NULL)
        return true;
    if(root->left&&root->val!=root->left->val)
        return false;
    if(root->right&&root->val!=root->right->val)
        return false;
    else
        return isUnivalTree(root->left)&&isUnivalTree(root->right);
}

当遍历到叶子节点后遍历到NULL,返回true,也代表着其
在这里插入图片描述
这样也是满足单值二叉树的条件。
排除极端条件。

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

这进入这两个函数

isUnivalTree(root->left)

就相当于进入左子树去判断是否满足条件。

isUnivalTree(root->right)

这就相当于进入右子树去判断是否满足条件。

之后,不断进入左子树与右子树。不断递归,直到节点未空,在依次判断是否满足单值的条件,不满足,返回假,则子树的返回值会一直是假。
非常巧妙的利用递归与左右子树的性质与优势。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值