题目
给你两棵二叉树的根节点
p
和q
,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
输入: p = [1,2,3], q = [1,2,3] 输出: true
题解
这里是判断当前两个数组中的数是否都是相同的,由于我们不确定里面会有多少数据,所以我们使用递归进行实现,我们先判断出参
p
和出参q
是不是都为null
,如果都为null
则直接返回true,因为这两个数组一样,没有则继续往下判断,当前出参p
或出参q
其中一个是否为null
,如果其中一个为null
则返回false
,没有则继续判断当前出参p
的值和出参q
的值是不是不相等,如果不相等则直接返回false
,否则将出参p
的左节点和出参q
的左节点传给自身进行判断,右节点也如此,最后看这两个自身函数返回的值,如果都一样那就是true
,如果不是则为false
/** * @param {TreeNode} p * @param {TreeNode} q * @return {boolean} */ var isSameTree = function(p, q) { if (p == null && q == null) return true; if (p == null || q == null) return false; if (p.val !== q.val) return false; return isSameTree(p.left, q.left) && isSameTree(p.right, q.right); };
我们这里还可以采用迭代的方式来实现,我们先声明一个常量stack
,它是一个栈,我们在将出参p
和出参q
全部都放到stack
栈中,然后使用循环去循环stack
,在循环中我们声明两个常量分为left
和right
,我们使用shift
方法将出参p
和q
取出,放到left
和right
常量中,然后进行判断当前的left
和right
常量是否为null
,如果都为null
则直接返回true
,如果不为null
则往下继续判断当前left
或right
常量其中一个值是否为null
或left
的val
属性值不等于right
的val
值,如果其中一项是则直接返回false
,如果不是则分别将left
和right
常量的左右节点全部使用push
方法追加到stack
栈中,待循环结束后,如果还没有返回false
则直接返回true
var isSameTree = function(p, q) { const stack = [p,q]; while (stack.length) { const left = stack.shift(); const right = stack.shift(); if (left === null && right === null) { return true; } if (left === null || right === null || left.val !== right.val) { return false; } stack.push(left.left); stack.push(right.left); stack.push(left.right); stack.push(right.right); } return true; };
坚持努力,无惧未来!