力扣-树-对称二叉树、翻转二叉树
1.对称二叉树(LeetCode 101)
- 题目概述:给定一个二叉树,检查它是否是镜像对称的。
- 题目案例:
- 解题思路:
判断两个树是否对称,就是先判断根节点是否一致,再判断其左子树和右子树是否对称
(1)递归法:通过两个指针遍历整棵树,pp 指针和 qq 指针一开始都指向这棵树的根,随后 pp 右移时,qq 左移,pp 左移时,qq 右移。每次检查当前 pp 和 qq 节点的值是否相等,如果相等再判断左右子树是否对称
一般情况下递归和迭代可以相互转,使用队列的方式
(2)迭代法:初始化时我们把根节点入队。每次提取两个结点并比较它们的值(队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像),然后将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束 - 递归java代码
class Solution {
public boolean isSymmetric(TreeNode root) {
return check(root,root);
}
public boolean check(TreeNode node1,TreeNode node2){
if(node1==null&&node2==null){
return true;
}
else if(node1==null||node2==null){
return false;
}
return node1.val==node2.val &&check(node1.left,node2.right)&&check(node1.right,node2.left);
}
}
-迭代java代码
class Solution {
public boolean isSymmetric(TreeNode root) {
return check(root, root);
}
public boolean check(TreeNode p,TreeNode q){
Queue<TreeNode> queue=new LinkedList<>();
queue.add(p);
queue.add(p);
while(!queue.isEmpty()){
p=queue.poll();
q=queue.poll();
if(p==null&&q==null) continue;
else if((p==null||q==null)||p.val!=q.val) return false;
queue.add(p.left);
queue.add(q.right);
queue.add(q.right);
queue.add(p.left);
}
return true;
}
}
2.翻转二叉树(LeetCode 226)
- 题目概述:翻转一棵二叉树。
- 题目案例:
- 解题思路:从根节点遍历整棵树,将左右子树进行翻转。同样也有递归法和迭代法两种,迭代法同样用队列实现
- 递归java代码
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return null;
}
TreeNode left = invertTree(root.left);
TreeNode right = invertTree(root.right);
root.left = right;
root.right = left;
return root;
}
}
- 迭代java代码
class Solution {
public TreeNode invertTree(TreeNode root){
if(root==null){
return null;
}
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
TreeNode node=queue.poll();
TreeNode temp=node.left;
node.left=node.right;
node.right=temp;
if(node.left!=null) queue.add(node.left);
if(node.right!=null) queue.add(node.right);
}
return root;
}
}