Leetcode-965.单值二叉树

Posted Booksort

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

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

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

以上是关于Leetcode-965.单值二叉树的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode-965 Univalued Binary Tree(单值二叉树)

LeetCode 965. 单值二叉树 / 467. 环绕字符串中唯一的子字符串 / 699. 掉落的方块(线段树后面再写)

LeetCode 965. Univalued Binary Tree

几道简单的二叉树OJ题

单值二叉树(2021-8-8)

965. 单值二叉树