每一个点开我的文章的小伙伴大家好!
在发这篇文章的时候,我是一名大二的学生,我将在博客记载我的学习之路!
这是我的第八篇博客文章,是关于最近刷力扣网站的一些好题和思路分享。
这次我要分享几题稍微进阶点的二叉树题目 有第100题 第110题
先讲讲第100题:
先说一下大概思路:比较两棵树是否相同 得看他们每一次遍历出来的结果是否相同
也就是说,只要有一次遍历出来的结果不一样,那就可以断定不是相同二叉树
我们要对可能出现的遍历的结果进行分析:
1.遍历的两个节点都没有左右子树,这个时候是符合结果相同的情况
2.遍历的两个节点,一个有右子树 一个没有右子树,或者一个有左子树,一个没有左子树
3.遍历的左右子树都有左右子树,但是左右子树节点内的值可能一样,可能不一样
以上就是一次遍历可能出现的情况,但是要对整棵树进行遍历的话,需要用到递归 而且是前序遍历
接下来结合代码分析,相信大家就会一目了然!
上代码!
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
if(p==NULL&&q==NULL) //结果1
return true;
else if(p==NULL||q==NULL) //结果2
return false;
else if(p->val!=q->val) //结果3 值不同
return false;
else { //结果3 值相同 这里隐含了递归“中”
return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right); // “左” “右”
/*可以分开写成
return isSameTree(p->left,q->left);
return isSameTree(p->right,q->right);*/
}
}
接着就是第110题:
平衡二叉查找树:简称平衡二叉树。由前苏联的数学家 Adelse-Velskil 和 Landis 在 1962 年提出的高度平衡的二叉树,根据科学家的英文名也称为 AVL 树。它具有如下几个性质:
- 可以是空树。
- 假如不是空树,任何一个结点的左子树与右子树都是平衡二叉树,并且高度之差的绝对值不超过 1。
了解了什么是平衡二叉树后,我就来讲讲大体思路:
首先要用到递归,而且是后序遍历 顺序是左右中 判断是否是平衡二叉树,如果有一个节点的左右子树高度差大于一,那么整棵树就不是平衡二叉树,所以这里有一个条件就是(左子树高度-右子树高度)的绝对值不能大于一。 大于一我们就可以判断整棵树不是平衡二叉树,所以可以设置一个标志,这里我设置的标志是返回-1.
附上代码,搭配上文字讲解相信大家多看几次会明白
int Depth(struct TreeNode*root)
{
if(root==NULL) return 0;
int height;
int leftheight=Depth(root->left); //计算节点的左子树高度
if(leftheight==-1) return -1;
int rightheight=Depth(root->right); //计算节点右子树高度
if(rightheight==-1) return-1;
if(abs(leftheight-rightheight)>1) //判断是否符合平衡二叉树的条件
return -1;
else {
height=1+fmax(leftheight,rightheight);
}
return height;
}
bool isBalanced(struct TreeNode* root)
{
int a=Depth(root);
if(a==-1) return false;
else return true;
}
leftheight rightheight面对的对象会随着每一次递归而改变
以leftheight举例子 第一次递归的时候,leftheight的对象是A 第二次递归时对象是B
这次的分享就到这里啦,如果有更好的思路欢迎提出,如有错误欢迎指出!