序言
学习随笔是本人对自己一天的自学回顾,由于本人是非科班出身,不懂很多cs的专业术语,所以难免会有些错误,望各位批评指正,本人定当悉心接受并立即改正。希望自己能够慢慢坚持下去,坚持转行的道路,坚持每天学习的输出。
刷题篇
LeetCode
1.题目
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回 true;否则返回 false。
2.大致思路
递归
/*
怎么才是单值二叉树:所有结点的值相同
即可认为,根节点的值等于左子树的值也等于右子树的值
而左子树根节点的值又等于左孩子的值也等于右孩子的值(左右孩子不为空),递归入口出现了
*/
上面这个思路是在当时做题时直接写的。
总结一下就是:
判断是否为单值二叉树,看根结点的值和左右子树的值是否相等,而与此同时,左右子树也需要是单值二叉树。
所以要判断树是否为单值二叉树,先判断左右子树是否为单值二叉树,这就是递归入口。
3.代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isUnivalTree(struct TreeNode* root){
if(root==NULL) return true;//空树为单值二叉树
if(root->left==NULL&&root->right==NULL) return true;//只有根结点为单值二叉树
if(root->left==NULL&&root->right!=NULL) //左孩子为空、右孩子不为空的情况
if(root->val==root->right->val)
return isUnivalTree(root->right);
if(root->left!=NULL&&root->right==NULL)//右孩子为空、左孩子不为空的情况
if(root->val==root->left->val)
return isUnivalTree(root->left);
if(root->left!=NULL&&root->right!=NULL){//左右均不为空的情况
if(root->val==root->left->val&&root->val==root->right->val) {
return isUnivalTree(root->left)&&isUnivalTree(root->right);
}
}
return false;
}
4.多说两句
这是我第一次,没有看评论或者题解,直接做对的题目(虽然其中有几次没有考虑好边界条件),真的很开心,我好像懂递归了,知道怎么找递归入口了。
多练习,多复习,多总结。
两年之后见分晓。