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. 掉落的方块(线段树后面再写)