子二叉树问题

问题来源:http://www.nowcoder.com/questionTerminal/6d3411aa1dfe4c449ebbf8879e97fadd?pos=3&orderByHotValue=1&done=0

两颗二叉树T1和T2,T1的节点数是百万数量级,T2的节点数一千以内,请给出判断T2是否是T1子树的可行算法。

想了想除了遍历好像没什么好方法了,但是百万数量级的二叉树遍历起来肯定很酸爽,注定不能用递归,但是我觉得,非递归用栈应该也很够呛。

还没想到比较好的方法,写了个非递归遍历比较的,思想就是,遍历T1, 如果一节点的value和T2的root的value相同,那么就一同遍历T2;

如果T2遍历完了,说明T2是T1的子树,如果遍历T2到一半发现它俩一个节点的值不同,则将存T2的栈清空,继续遍历T1。

我觉得是不是得考虑KMP算法解决的那个问题,继续遍历T2是不是有点不妥。

    public boolean isSameTree(TreeNode bt1, TreeNode bt2){
        Stack<TreeNode> BT1 = new Stack();
        Stack<TreeNode> BT2 = new Stack();
        TreeNode tmp1,tmp2;
        if((bt1 == null && bt2 != null)|| (bt1 != null && bt2 == null)){
            return false;
        }
        if(bt1 == null && bt2 != null){
            return true;
        }
        BT1.push(bt1);
        BT2.push(bt2);
        while(!(BT1.isEmpty() || BT2.isEmpty())){
            tmp1 = BT1.peek();
            tmp2 = BT2.peek();
            BT1.pop();
            if(tmp1.val == tmp2.val){
                if(tmp1.right != null){
                    BT1.push(tmp1.right);
                }
                if(tmp1.left != null){
                    BT1.push(tmp1.left);
                }
                BT2.pop();
                if(tmp2.right != null){
                    BT2.push(tmp1.right);
                }        
                if(tmp2.left != null){
                    BT2.push(tmp1.left);
                }                
            }
            else{
                if(tmp1.right != null){
                    BT1.push(tmp1.right);
                }
                if(tmp1.left != null){
                    BT1.push(tmp1.left);
                }                
                if(!BT2.isEmpty()){
                    BT2.clear();
                    BT2.push(bt2);
                }
            }
        }
        if(BT2.isEmpty()){
            return true;
        }
        return false;
    }
    

 

posted on 2015-07-05 23:22  zxahu  阅读(230)  评论(0编辑  收藏  举报

导航