本系列是《剑指offer》或leetcode的JavaScript版本。 每期1-2个算法,也有可能是一个类别。 文章包括题目、思路以及代码。 如果您对本期有不同或者更好的见解,请后台留言,喜欢请点个好看,谢谢阅读。
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
二叉树的右子树是二叉树左子树的镜像二叉树。
镜像二叉树:两颗二叉树根结点相同,但他们的左右两个子节点交换了位置。
如图,1为对称二叉树,2、3都不是。
递归所有节点满足以上条件即二叉树对称。
function isSymmetrical(pRoot) { return isSymmetricalTree(pRoot, pRoot); }
function isSymmetricalTree(node1, node2) { if (!node1 && !node2) { return true; } if (!node1 || !node2) { return false; } if (node1.val != node2.val) { return false; } return isSymmetricalTree(node1.left, node2.right) && isSymmetricalTree(node1.right, node2.left); }
请实现两个函数,分别用来序列化和反序列化二叉树
function Serialize(pRoot, arr = []) { if (!pRoot) { arr.push('#'); } else { arr.push(pRoot.val); Serialize(pRoot.left, arr) Serialize(pRoot.right, arr) } return arr.join(','); }
function Deserialize(s) { if (!s) { return null; } return deserialize(s.split(',')); }
function deserialize(arr) { let node = null; const current = arr.shift(); if (current !== '#') { node = { val: current } node.left = deserialize(arr); node.right = deserialize(arr); } return node; }