题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路:
当根为空,是对称的,不为空就开始比较。比较左子树A和右子树B。
然后比较的是左子树的左节点和右子树的右节点。左子树的右节点和左子树的左节点。虽然都是比较两颗树,但本题与26题比较树的子结构有些区别。
public class Solution { boolean isSymmetrical(TreeNode pRoot) { if (pRoot == null) return true; return Symmetrical(pRoot.left, pRoot.right); } boolean Symmetrical(TreeNode t1, TreeNode t2) { //都为空时,才对称。有一个为空,另一个不为空时,不对称。都不为空,进行值比较,然后递归 if (t1 == null && t2 == null) return true; if (t1 == null || t2 == null) return false; if (t1.val != t2.val) return false; return Symmetrical(t1.left, t2.right) && Symmetrical(t1.right, t2.left); } }
思路2:非递归写法 深度遍历 使用栈 广度遍历使用队列。这里使用栈
import java.util.Stack; public class Solution { boolean isSymmetrical(TreeNode pRoot) { Stack<TreeNode> stack = new Stack<>(); if(pRoot == null) return true; stack.push(pRoot.left); stack.push(pRoot.right); while(!stack.empty()){ TreeNode t1 = stack.pop(); TreeNode t2 = stack.pop(); if (t1 == null && t2 == null) //都为空需要进一步判断,这与递归不同 //这是因为有可能是某个节点的左子树都是空,但是还需要比较这个节点的右子树 //所以冒然判断两个节点为空,就说是对称的是不行的,需要继续判断。 continue; if (t1 == null || t2 == null) return false; if (t1.val != t2.val) return false; stack.push(t1.right); stack.push(t2.left); stack.push(t1.left); stack.push(t2.right); } return true; } }
所以补充队列的写法
import java.util.LinkedList; import java.util.Queue; public class Solution { boolean isSymmetrical(TreeNode pRoot) { if(pRoot == null) return true; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(pRoot.left); queue.offer(pRoot.right); while(!queue.isEmpty()){ TreeNode t1 = queue.poll(); TreeNode t2 = queue.poll(); if (t1 == null && t2 == null) continue; if (t1 == null || t2 == null) return false; if (t1.val != t2.val) return false; queue.offer(t1.left); queue.offer(t2.right); queue.offer(t1.right); queue.offer(t2.left); } return true; } }