JZ58-对称的二叉树
对称的二叉树
https://www.nowcoder.com/practice/ff05d44dfdb04e1d83bdbdab320efbcb?tpId=13&tags=&title=&diffculty=0&judgeStatus=0&rp=1&tab=answerKey
class Solution { boolean isSymmetrical(TreeNode pRoot) { if (pRoot == null) { return true; } return isSame(pRoot.left, pRoot.right); } boolean isSame(TreeNode lRoot, TreeNode rRoot) { if (lRoot == null && rRoot == null) { return true; } if (lRoot == null || rRoot == null) { //只要有任意一个为非空 return false; } if (lRoot.val != rRoot.val) { return false; } return isSame(lRoot.left, rRoot.right) && isSame(lRoot.right, rRoot.left); } } /** * 分享一种非递归算法,主要思路是:设置两个链表,分别代表左子树和右子树。 * 左子树每次都从左往右添加节点,右子树每次都从右往左添加节点。 */ class Solution2 { boolean isSymmetrical(TreeNode pRoot) { if (pRoot == null) return true; LinkedList<TreeNode> leftList = new LinkedList<>(); LinkedList<TreeNode> rightList = new LinkedList<>(); leftList.add(pRoot.left); rightList.add(pRoot.right); while (!leftList.isEmpty() && !rightList.isEmpty()) { TreeNode leftNode = leftList.poll(); TreeNode rightNode = rightList.poll(); if (leftNode == null && rightNode == null) continue; if (leftNode == null || rightNode == null) return false; if (leftNode.val != rightNode.val) return false; // 左子树从左往右添加节点 leftList.add(leftNode.left); leftList.add(leftNode.right); // 右子树从右往左添加节点 rightList.add(rightNode.right); rightList.add(rightNode.left); } return leftList.isEmpty() && rightList.isEmpty(); } }