剑指offer(12) 镜像二叉树 对称的二叉树
题目:
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
思路:
只有当前节点的左右节点都不为空的时候才继续向下处理,交换当前左右节点的值,然后递归处他们的子节点.
代码:
public void Mirror(TreeNode root)
{
if (root == null)
{
return;
}
else
{
if (root.right != null || root.left != null)
{
TreeNode node = null;
node = root.right;
root.right = root.left;
root.left = node;
}
Mirror(root.right);
Mirror(root.left);
}
}
//此注释为了纪念第一次没有查看书籍,手动编写直接过所有测试点
题目:
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
2
3 3 这样的二叉树称为对称的。
7 5 5 7
思路:
方法1
递归判断每个节点的子节点,如果其中有个节点为null 那就直接返回false。如果递归到没有下一个节点之前都是true ,那就说明这个二叉树是对称的。
方法2
先序遍历,比较 根 右 左的顺序遍历.如果相同则是对称的.
代码:
boolean isSymmetrical(TreeNode pRoot)
{
if(pRoot==null)
return true;
return core(pRoot.left,pRoot.right);
}
private boolean core(TreeNode root1,TreeNode root2)
{
if (root1==null&&root2==null)
return true;
if(root1==null||root2==null)
return false;
if(root1.val!=root2.val)
return false;
return core(root1.left,root2.right)&&core(root1.right,root2.left);
}