js(78)~101. 对称二叉树

69 阅读1分钟

力扣本题传送门 这道题常规方法也是两种bfs广度优先-迭代,dfs深度优先-递归,对于本题还是递归好理解,并且刚写过的上一题77是否相同两个二叉树有观点类似

方法一

总结下来就是当前比较的两个节点要么全部为空,这样才对称;如果一个为空,另外一个非空,那肯定是不对称的 要对称,肯定是左子树的左节点和右子树的右节点对比同时左子树的右节点和右子树的左节点对比

var isSymmetric = function (root) {

	const check = (a, b) => {
		if (!a || !b) {
			return a === b;
		}

		return a.val === b.val && check(a.left, b.right) && check(a.right, b.left);
	}

	return check(root, root)

};

方法二 迭代深度优先

自己用队列来实现函数的递归调用 按照一对一对的顺序加入队列

左子节点的左节点和右子节点的右节点

左子节点的右节点和右子节点的左节点

出队列的时候也一对一对出,然后比较出队列的这一对节点是否对称,怎样算对称呢

要么俩节点都是空的节点 要么都不是空节点并且节点值相等

var isSymmetric = function (root) {

	const check = (a, b) => {
		const s = [a, b]
		while (s.length) {
			let l = s.shift();
			let r = s.shift();

			// 左右都咩有值
			if (!l && !r) {
				continue;
			}
			// 两个有一个为空则不对称
			if (!l || !r || l.val !== r.val) {
				return false;
			}

			s.push(l.left);
			s.push(r.right);
			s.push(l.right);
			s.push(r.left);

		}
		return true;

	}

	return check(root, root)

};