题目:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树和它的镜像一样,定义其为对称的。
思路:
1.二叉树在结构上必须对称,对称结构的对称位置数据的值相同。我们可以通过比较二叉树的前序遍历序列和对称前序遍历序列来判断二叉树是不是对称的。
2.本题我们可以使用递归,判断一颗二叉树是否为对称二叉树。
java参考代码如下:
package chapter4;
public class P159_SymmetricalBinaryTree {
public static class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val){
this.val=val;
this.left=null;
this.right=null;
}
}
public static boolean isSymmetrical(TreeNode root){
return isSymmetrical(root,root);
}
public static boolean isSymmetrical(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;
//root1:preordered root2:postordered
return isSymmetrical(root1.left,root2.right)&&isSymmetrical(root1.right,root2.left);
}
public static void main(String[] args) {
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(2);
root.left.left = new TreeNode(3);
root.left.right = new TreeNode(4);
root.right.left = new TreeNode(4);
root.right.right = new TreeNode(3);
System.out.println(isSymmetrical(root));
}
}
基于以上思路,参考代码如下:
bool isSymmetrical(TreeNode* pRoot)
{
return ISSymme(pRoot,pRoot);
}
bool ISSymme(TreeNode* pRoot1,TreeNode* pRoot2)
{
if(pRoot1==nullptr && pRoot2==nullptr)
return true;
if(pRoot1==nullptr || pRoot2==nullptr)
return false;
if(pRoot1->val != pRoot2->val)
return false;
return ISSymme(pRoot1->left,pRoot2->right) && ISSymme(pRoot1->right,pRoot2->left);
}
测试用例:
a.功能测试(对称的二叉树;因结构不对称的二叉树;结构对称但节点的值不对称的二叉树)。
b.特殊输入测试(二叉树的根节点为nullptr指针;只有一个节点的二叉树;所有节点的值都相同的二叉树)。
参考:
https://blog.csdn.net/cherrydreamsover/article/details/81662112