题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。、
对称二叉树:如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
解题思路
由对称二叉树的定义,我们需要用到二叉树镜像的知识,这点之前的文章中已经讲道了,可自行去查找。
方法一:递归。根节点的左右子树相同,左子树的左子树和右子树的右子树相同,左子树的右子树和右子树的左子树相同即可。
方法二:非递归。同递归采用思想相同,只不过借助栈结构来存储节点。
详情看代码!!!!!!!!思路还是很清晰的
图示
二叉树结构:
代码实现
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
import java.util.Stack;
class TreeNode{ //定义二叉树的节点
TreeNode father;
int val;
TreeNode left;
TreeNode right;
TreeNode(TreeNode left,TreeNode right){
this.left=left;
this.right=right;
}
TreeNode(int val){
this.val=val;
}
TreeNode(){}
}
public class symmetryTree {
//对称二叉树
public boolean isSymmetry(TreeNode root){//递归法
if (root==null){
return true;
}
return isSymmetry(root.left,root.right);
}
public boolean isSymmetry(TreeNode left,TreeNode right){
if (left==null&&right==null){
return true;
}
if (left==null||right==null){
return false;
}
if (left.val==right.val){
return isSymmetry(left.left,right.right)&&isSymmetry(left.right,right.left);
}
return false;
}
public boolean isSymmetry_2(TreeNode root){//非递归
if (root==null){
return true;
}
Stack<TreeNode> s=new Stack<>();
s.push(root.left);
s.push(root.right);
while (!s.isEmpty()){
TreeNode right=s.pop();
TreeNode left=s.pop();
if (left==null&&right==null){
continue;
}
if (left==null||right==null){
return false;
}
if (right.val!=left.val){
return false;
}
s.push(left.left);
s.push(right.right);
s.push(left.right);
s.push(right.left);
}
return true;
}
public static void main(String[] args) {
TreeNode nodeA = new TreeNode();
TreeNode nodeB = new TreeNode();
TreeNode nodeC = new TreeNode();
nodeA.left = nodeB;
nodeA.right = nodeC;
nodeA.val = 1;
nodeB.left = null;
nodeB.right = null;
nodeB.val = 2;
nodeC.left = null;
nodeC.right = null;
nodeC.val = 2;
symmetryTree test=new symmetryTree();
boolean is=test.isSymmetry(nodeA);
System.out.println("是否为对称二叉树:"+is);
}
}
总结
本题来源于面试经典教材《剑指offer》中 归属于二叉树类型题目。
同许多在算法道路上不断前行的人一样,不断练习,修炼自己!
如有博客中存在的疑问或者建议,可以在下方留言一起交流,感谢各位!
最后,感谢AIAS!
国庆假期过得真快。。。。感觉状态调整的还是不好,今天一天补了下国庆没写的博客,准备继续苦逼的科研生活,项目工期有点紧,活好多啊!!!!好多还没做。。