题解 | #相同的二叉树#

相同的二叉树

http://www.nowcoder.com/practice/5a3b2cf4211249c89d6ced7987aeb775

判断相同的二叉树

解题过程

1.基本思路:

由于本人是菜鸡出炉,所以我用的是二叉树中最基础的前序、中序和后序遍历,首先我们明白,前序+中序或者中序+后序可以确定唯一一个二叉树,但是先序+后序不行,所以我采用的是先序加中序的方法. 不过后序遍历的方法写成注释了。遍历我就不解释了。 对于遍历的结果,我采用List接口的一个实现类--ArrayList来存储,用add(Object obj)方法存数据,然后在比较时用get(int index)方法来获取。这里注意我将root是否为null的判断结果也存储进去了,这样就可以解决一个问题:一个测试用例是 [1,1],[1,#,1]如果按照这样遍历来写,那么null他是不会进行添加的,也就是最后都是[1,1],[1,1]但是他们是两个不一样的树。 要判断是否相同,我先进行判断他们返回的ArrayList长度是否相同,如果不同,则返回false,如果相同,继续操作,就是将数据取出来一个一个比较,非常老实的想法

2.注意点和问题

一个问题我在上文写了:一个测试用例是 [1,1],[1,#,1]如果按照这样遍历来写,那么null他是不会进行添加的,也就是最后都是[1,1],[1,1]但是他们是两个不一样的树 还有一个非常严重的问题,我这个答案在牛客网可以通过,但是在LeetCode上面无法通过(LeetCode是第100题),在LeetCode通过了59/60个例子,唯独最后一个例子没通过,我想了很久也没有解决这个问题,想用debug调试,发现要钱,所以我来牛客网想白嫖(不是)调试,然后就写下这个博客。希望有大佬能解决我这个疑惑


/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root1 TreeNode类 
     * @param root2 TreeNode类 
     * @return bool布尔型
     */
    public boolean isSameTree (TreeNode root1, TreeNode root2) {
        // write code here
        List listp1 = new ArrayList();
        List listq1 = new ArrayList();
        List listp2 = new ArrayList();
        List listq2 = new ArrayList();
        // List listp3 = new ArrayList();
        // List listq3 = new ArrayList();
        preOrderTraversal(listp1, root1);
        preOrderTraversal(listq1, root2);
        inOrderTraversal(listp2, root1);
        inOrderTraversal(listq2, root2);
        //    postOrderTraversal(listp3,p);
        //    postOrderTraversal(listq3,q);
        if (listp1.size() != listq1.size()) {
            return false;
        }

        for (int i = 0; i < listp1.size(); i++) {
            if (listp1.get(i) != listq1.get(i)) {
                return false;
            }
        }
        for (int i = 0; i < listp2.size(); i++) {
            if (listp2.get(i) != listq2.get(i)) {
                return false;
            }
        }
        
         //    for(int i=0;i<listp3.size();i++){
        //        if(listp3.get(i)!=listq3.get(i)){
        //            return false;
        //        }
        //    }
       
        return true;


    }

    public void preOrderTraversal(List list, TreeNode root) {
        if (root == null) {
            list.add(null);
            return;
        }
        list.add(root.val);
        preOrderTraversal(list, root.left);
        preOrderTraversal(list, root.right);
    }

    public void inOrderTraversal(List list, TreeNode root) {
        if (root == null) {
            list.add(null);
            return;
        }
        inOrderTraversal(list, root.left);
        list.add(root.val);
        inOrderTraversal(list, root.right);
    }
    // public void postOrderTraversal(List list,TreeNode root){
    //     if(root==null){
    //         list.add(null);
    //         return;
    //     }
    //     postOrderTraversal(list,root.left);
    //     postOrderTraversal(list,root.right);
    //     list.add(root.val);
    // }
   
    
    
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-27 10:21
点赞 评论 收藏
分享
像好涩一样好学:这公司我也拿过 基本明确周六加班 工资还凑活 另外下次镜头往上点儿
点赞 评论 收藏
分享
hso_:哈哈哈哈哈哈我没offer一样在同一道题开喷了
投递深圳同为数码等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务