zoukankan      html  css  js  c++  java
  • LeetCode_100. Same Tree

    100. Same Tree

    Easy

    Given two binary trees, write a function to check if they are the same or not.

    Two binary trees are considered the same if they are structurally identical and the nodes have the same value.

    Example 1:

    Input:     1         1
              /        / 
             2   3     2   3
    
            [1,2,3],   [1,2,3]
    
    Output: true
    

    Example 2:

    Input:     1         1
              /           
             2             2
    
            [1,2],     [1,null,2]
    
    Output: false
    

    Example 3:

    Input:     1         1
              /        / 
             2   1     1   2
    
            [1,2,1],   [1,1,2]
    
    Output: false
    package leetcode.easy;
    
    import java.util.ArrayDeque;
    
    /**
     * Definition for a binary tree node. public class TreeNode { int val; TreeNode
     * left; TreeNode right; TreeNode(int x) { val = x; } }
     */
    class TreeNode {
    	int val;
    	TreeNode left;
    	TreeNode right;
    
    	TreeNode(int x) {
    		val = x;
    	}
    }
    
    public class SameTree {
    	@org.junit.Test
    	public void test1() {
    		TreeNode tn11 = new TreeNode(1);
    		TreeNode tn12 = new TreeNode(2);
    		TreeNode tn13 = new TreeNode(3);
    		tn11.left = tn12;
    		tn11.right = tn13;
    		tn12.left = null;
    		tn12.right = null;
    		tn13.left = null;
    		tn13.right = null;
    
    		TreeNode tn21 = new TreeNode(1);
    		TreeNode tn22 = new TreeNode(2);
    		TreeNode tn23 = new TreeNode(3);
    		tn21.left = tn22;
    		tn21.right = tn23;
    		tn22.left = null;
    		tn22.right = null;
    		tn23.left = null;
    		tn23.right = null;
    
    		System.out.println(isSameTree1(tn11, tn21));
    		System.out.println(isSameTree2(tn11, tn21));
    	}
    
    	@org.junit.Test
    	public void test2() {
    		TreeNode tn11 = new TreeNode(1);
    		TreeNode tn12 = new TreeNode(2);
    		tn11.left = tn12;
    		tn11.right = null;
    		tn12.left = null;
    		tn12.right = null;
    
    		TreeNode tn21 = new TreeNode(1);
    		TreeNode tn22 = new TreeNode(2);
    		tn21.left = null;
    		tn21.right = tn22;
    		tn22.left = null;
    		tn22.right = null;
    
    		System.out.println(isSameTree1(tn11, tn21));
    		System.out.println(isSameTree2(tn11, tn21));
    	}
    
    	@org.junit.Test
    	public void test3() {
    		TreeNode tn11 = new TreeNode(1);
    		TreeNode tn12 = new TreeNode(2);
    		TreeNode tn13 = new TreeNode(1);
    		tn11.left = tn12;
    		tn11.right = tn13;
    		tn12.left = null;
    		tn12.right = null;
    		tn13.left = null;
    		tn13.right = null;
    
    		TreeNode tn21 = new TreeNode(1);
    		TreeNode tn22 = new TreeNode(1);
    		TreeNode tn23 = new TreeNode(2);
    		tn21.left = tn22;
    		tn21.right = tn23;
    		tn22.left = null;
    		tn22.right = null;
    		tn23.left = null;
    		tn23.right = null;
    
    		System.out.println(isSameTree1(tn11, tn21));
    		System.out.println(isSameTree2(tn11, tn21));
    	}
    
    	public boolean isSameTree1(TreeNode p, TreeNode q) {
    		// p and q are both null
    		if (p == null && q == null) {
    			return true;
    		}
    		// one of p and q is null
    		if (q == null || p == null) {
    			return false;
    		}
    		if (p.val != q.val) {
    			return false;
    		}
    		return isSameTree1(p.right, q.right) && isSameTree1(p.left, q.left);
    	}
    
    	public boolean check(TreeNode p, TreeNode q) {
    		// p and q are null
    		if (p == null && q == null) {
    			return true;
    		}
    		// one of p and q is null
    		if (q == null || p == null) {
    			return false;
    		}
    		if (p.val != q.val) {
    			return false;
    		}
    		return true;
    	}
    
    	public boolean isSameTree2(TreeNode p, TreeNode q) {
    		if (p == null && q == null) {
    			return true;
    		}
    		if (!check(p, q)) {
    			return false;
    		}
    
    		// init deques
    		ArrayDeque<TreeNode> deqP = new ArrayDeque<TreeNode>();
    		ArrayDeque<TreeNode> deqQ = new ArrayDeque<TreeNode>();
    		deqP.addLast(p);
    		deqQ.addLast(q);
    
    		while (!deqP.isEmpty()) {
    			p = deqP.removeFirst();
    			q = deqQ.removeFirst();
    
    			if (!check(p, q)) {
    				return false;
    			}
    			if (p != null) {
    				// in Java nulls are not allowed in Deque
    				if (!check(p.left, q.left)) {
    					return false;
    				}
    				if (p.left != null) {
    					deqP.addLast(p.left);
    					deqQ.addLast(q.left);
    				}
    				if (!check(p.right, q.right)) {
    					return false;
    				}
    				if (p.right != null) {
    					deqP.addLast(p.right);
    					deqQ.addLast(q.right);
    				}
    			}
    		}
    		return true;
    	}
    }
    
  • 相关阅读:
    POJ 3041 Asteroids 二分图匹配
    ZOJ 3705 Applications 模拟
    UNIX环境高级编程(第3版)
    明清美文四卷本(共四册)
    卑鄙的圣人:曹操(全10册)
    爱丽丝梦游仙境
    我在大清官场30年
    乌合之众:大众心理研究
    Java多线程编程实战指南
    Linux就该这么学
  • 原文地址:https://www.cnblogs.com/denggelin/p/11601193.html
Copyright © 2011-2022 走看看