题目描述

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

代码一(错误的)

思想:通过中序遍历,把遍历的节点存入到list中去,然后判断list的头和尾,但是牛客通过为90%,原因是单独的中序遍历不能确定一棵树.所以当所有节点的值一样的时候就会出错误.

  1. ArrayList<TreeNode> arr = new ArrayList<TreeNode>();
  2. boolean isSymmetrical(TreeNode pRoot)
  3. {
  4. middleOrder(pRoot);
  5. if(arr.size()==1||arr.size()==0)return true;
  6. if(arr.size()%2==0)return false;
  7. int i=0;
  8. int j=arr.size()-1;
  9. while(i<j) {
  10. if(arr.get(i).val!=arr.get(j).val) {
  11. return false;
  12. }
  13. i++;
  14. j--;
  15. }
  16. return true;
  17. }
  18. public void middleOrder(TreeNode pRoot) {
  19. if(pRoot!=null) {
  20. middleOrder(pRoot.left);
  21. arr.add(pRoot);
  22. middleOrder(pRoot.right);
  23. }
  24. }

代码二

  1. boolean isSymmetrical(TreeNode pRoot)
  2. {
  3. return pRoot==null||jude(pRoot.left,pRoot.right);
  4. }
  5. public boolean jude(TreeNode Node1,TreeNode Node2) {
  6. if(Node1==null&&Node2==null) {
  7. return true;
  8. }
  9. if(Node1==null||Node2==null) {
  10. return false;
  11. }
  12. if(Node1.val!=Node2.val) {
  13. return false;
  14. }else {
  15. return jude(Node1.left,Node2.right)&&jude(Node1.right,Node2.left);
  16. }
  17. }