这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战
题目描述
给定2个二叉树 p 和 q ,需要你判断这两个二叉树是不是相同的。
如果是相同的,则返回true。否则返回false。
如何判断是否相等, 二叉树的结构一样,然后节点的val是一样的,则认为这两个二叉树是相同的。
举个例子:
结构一样,节点的val一样,是相等的
节点的val一样,但是结构不一致,所以是不相等
思路分析
第一种方法
我们可以先对根节点判断,如果都为空,则证明当前节点为空,返回true。
如果不相等则返回false。
如果根节点的val相等,则继续判断左边树,递归调用来判断。
如果左边树不相等,则直接返回false。
如果相等,则继续判断右边树,递归调用来判断。也是同样的逻辑。
返回判断的结果即可。
代码如下:
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} p
* @param {TreeNode} q
* @return {boolean}
*/
var isSameTree = function (p, q) {
if (!p && !q) return true
if (p && !q) return false
if (!p && q) return false
if (p.val !== q.val) return false
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right)
};
第二种方法
第一种方法使用了dfs, 深度优先算法,先算根节点,再计算左边树,算完左边树再计算右边树。
这个方法主要是利用bfs,广度优先算法,由上往下计算,算完一层再计算一层。
先把根节点放到对应的队列数组中,然后把它们取出来判断val是否相等,如果不相等则返回false。
然后接着取根节点下的左右节点,如果有一个有节点,另一个没有,则返回false。
然后把它们push到队列数组中,这里使用的while循环,push后的队列数组长度如果不一样,则会返回false。
while循环以队列数组的长度为条件,重复上面的操作,当遍历到最后的时候,队列应该是空的,然后退出循环,则证明树的节点都是相同的,返回true即可。
代码如下:
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} p
* @param {TreeNode} q
* @return {boolean}
*/
var isSameTree = function (p, q) {
if (!p && !q) return true
if (!p || !q) return false
const pQuene = [p]
const qQuene = [q]
while (pQuene.length || qQuene.length) {
let pLen = pQuene.length
let qLen = qQuene.length
if (pLen !== qLen) return false
const p = pQuene.shift()
const q = qQuene.shift()
if (p.val !== q.val) return false
const pl = p.left
const pr = p.right
const ql = q.left
const qr = q.right
if ((pl && !ql) || (!pl && ql)) return false
if ((pr && !qr) || (!pr && qr)) return false
pl && pQuene.push(pl)
pr && pQuene.push(pr)
ql && qQuene.push(ql)
qr && qQuene.push(qr)
}
return true
};