这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战
一、定义
上一章说了链表,我们知道链表是单向的,要是需要了解树结构就必须要吧链表结构熟悉透,一般的树结构有文件夹或者公司的组织架构。然而最经典的树是二叉树,每个节点下的数量最多只有两颗,并且有左右之分,一般叫做左子树(left subtree)和右子树(right subtree)。还有更多特殊的二叉树,例如二叉搜索树,二叉堆。
二叉树特征:
- 且二叉树深度不限,但是每个节点最多有两个子树,注意有一个也是可以的,不是只能有两个
- 左子树和右子树是有顺序的不能换顺序就和左右手一样,就算只有一个子节点也要区分是左右树
二、leetCode第100题相同树判定
题目:
提示:
在这里我们要先知道二叉树的几种形态:
- 空二叉树,两个根节点是空的,也就是左子树和右子树是空的
- 只有一个根节点的二叉树
- 右子树是空的,只有左子树
- 左子树是空的,只有右子树
- 真实完整的二叉树
思路解析:
- 首先,因为无法判断树有多少层,有多少个子节点,所以只能写相同的逻辑使用迭代或者递归实现。递归和迭代相比,递归更简单一点,所以推荐使用递归
- 然后判断p和q是否是null,如果都是null就无法判断,把能确定的是否是null的给排除掉,也就是把上面的提示中的前几个方案给排除掉,直到确定目前传过来的是真实完整的二叉树为止再进行下一步操作。
- 排除掉上面的问题后就可以使用递归判断左子树再判断右子树是否一致。
答案代码:
var isSameTree = function(p,q) {
//判断p和q都是null,都是空二叉树,所以他们相等
if(p == null && q == null) {
return true;
}
if(p == null || q == null) {
return false;
}
if(p.val != q.val) {
return false;
}
//p和q的值相等,使用递归判断左右子树
return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
}
好啦这就是二叉树算法,发现在算法题里好多都用到了递归,递归真的可以好好练练。