• LeetCode101----对称二叉树


    给定一个二叉树,检查它是否是镜像对称的。

    例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

        1
       / 
      2   2
     /  / 
    3  4 4  3
    

    但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

        1
       / 
      2   2
          
       3    3

    代码如下:
    public class LeetCode101 {
    	public boolean isSymmetric = true;
    
    	public static class TreeNode {
    		int val;
    		TreeNode left;
    		TreeNode right;
    
    		TreeNode(int x) {
    			val = x;
    		}
    	}
    
    	public boolean isSymmetric(TreeNode root) {
    		if (root == null) {
    			return true;
    		}
    		isSymmetric(root.left, root.right);
    		return isSymmetric;
    	}
    
    	public void isSymmetric(TreeNode left, TreeNode right) {
    		if (left == null || right == null) {
    			if (left != right) {
    				isSymmetric = false;
    			}
    			return;
    		}
    		isSymmetric(left.left, right.right);
    		isSymmetric(left.right, right.left);
    		if (left != null && right != null) {
    			if (left.val != right.val) {
    				isSymmetric = false;
    			}
    		}
    	}
    }
    

      非递归代码如下所示:

    public class NonLeetCode101 {
    	public boolean isSymmetric = true;
    
    	public static class TreeNode {
    		int val;
    		TreeNode left;
    		TreeNode right;
    
    		TreeNode(int x) {
    			val = x;
    		}
    	}
    
    	public boolean isSymmetric(TreeNode root) {
    		if (root == null) {
    			return true;
    		}
    		isSymmetric(root.left, root.right);
    		return isSymmetric;
    	}
    
    	public void isSymmetric(TreeNode left, TreeNode right) {
    		if (left == null || right == null) {
    			if (left != right) {
    				isSymmetric = false;
    			}
    			return;
    		}
    		if (left.val != right.val) {
    			isSymmetric = false;
    			return;
    		}
    		Stack<TreeNode> lStack = lStruct(left);
    		Stack<TreeNode> rStack = rStruct(right);
    		if (lStack.size() != rStack.size()) {
    			isSymmetric = false;
    			return;
    		}
    		System.out.println("栈大小:" + lStack.size());
    		while (lStack.size() > 0) {
    			TreeNode n1 = lStack.pop();
    			TreeNode n2 = rStack.pop();
    			if (n1 == null || n2 == null) {
    				if (n1 != n2) {
    					isSymmetric = false;
    					return;
    				}
    			} else if (n1 != null && n2 != null) {
    				if (n1.val != n2.val) {
    					isSymmetric = false;
    					return;
    				}
    			}
    		}
    	}
    
    	private Stack<TreeNode> lStruct(TreeNode root) {
    		Stack<TreeNode> stack = new Stack<>();
    		Stack<TreeNode> reStack = new Stack<>();
    		stack.push(root);
    		while (!stack.isEmpty()) {
    			root = stack.pop();
    			reStack.push(root);
    			if (root != null) {
    				if (root.right != null) {
    					stack.push(root.right);
    				} else if (root.right == null) {
    					stack.push(null);
    				}
    				if (root.left != null) {
    					stack.push(root.left);
    				} else if (root.left == null) {
    					stack.push(null);
    				}
    			}
    		}
    		return reStack;
    	}
    
    	private Stack<TreeNode> rStruct(TreeNode root) {
    		Stack<TreeNode> stack = new Stack<>();
    		Stack<TreeNode> reStack = new Stack<>();
    		stack.push(root);
    		while (!stack.isEmpty()) {
    			root = stack.pop();
    			reStack.push(root);
    			if (root != null) {
    				if (root.left != null) {
    					stack.push(root.left);
    				} else if (root.left == null) {
    					stack.push(null);
    				}
    				if (root.right != null) {
    					stack.push(root.right);
    				} else if (root.right == null) {
    					stack.push(null);
    				}
    			}
    		}
    		return reStack;
    	}
    }
    

     递归代码如下:

    public class LeetCode101 {
    	public boolean isSymmetric = true;
    
    	public static class TreeNode {
    		int val;
    		TreeNode left;
    		TreeNode right;
    
    		TreeNode(int x) {
    			val = x;
    		}
    	}
    
    	public boolean isSymmetric(TreeNode root) {
    		if (root == null) {
    			return true;
    		}
    		isSymmetric(root.left, root.right);
    		return isSymmetric;
    	}
    
    	public void isSymmetric(TreeNode left, TreeNode right) {
    		if (left == null || right == null) {
    			if (left != right) {
    				isSymmetric = false;
    			}
    			return;
    		}
    		isSymmetric(left.left, right.right);
    		isSymmetric(left.right, right.left);
    		if (left != null && right != null) {
    			if (left.val != right.val) {
    				isSymmetric = false;
    			}
    		}
    	}
    }
    

      

  • 相关阅读:
    [atARC088F]Christmas Tree
    [atARC109F]1D Kingdom Builder
    [luogu4259]寻找车位
    [atARC087F]Squirrel Migration
    [atARC087E]Prefix-free Game
    [atARC110F]Esoswap
    [atARC110E]Shorten ABC
    [atARC084D]Small Multiple
    [atARC083F]Collecting Balls
    [hihocoder][Offer收割]编程练习赛49
  • 原文地址:https://www.cnblogs.com/Booker808-java/p/9058397.html
Copyright © 2020-2023  润新知