牛客_剑指offer题集——树的子结构(java实现)

题目链接:

https://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88?tpId=13&tqId=11170&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路:先通过层次遍历将a树中和b树根节点相同值的结点全部存入缓存数组,然后遍历缓存数组,通过判断二树结构是否相同的递归方法,来返回值

 

需要注意的点:在递归函数中,不能判断到A树的空值就返回,必须先改一下标记,否则很可能b树此处不为空而a树为空导致错误判断

代码实现:

package niuke;

public class 树的子结构 {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root1==null||root2==null) return false;
        /**
         * 使用层次遍历找出大一些的树中第二颗子树的根节点
         */
        TreeNode[] queue = new TreeNode[1000];
        int front = 0;
        int rear = 0;
        rear = (rear+1)%1000;
        TreeNode tn = root1;
        queue[rear] = tn;
        TreeNode[] buffer = new TreeNode[1000];
        int index = 0;
        while(front!=rear){
            front = (front+1)%1000;
            tn = queue[front];
            if(tn.val==root2.val){
                buffer[index] = tn;
                index++;
            }
            if(tn.left!=null) {
                rear = (rear + 1) % 1000;
                queue[rear] = tn.left;
            }
            if(tn.right!=null) {
                rear = (rear + 1) % 1000;
                queue[rear] = tn.right;
            }
        }
        boolean flag_in = false;
        for(TreeNode each :buffer){
            flag = true;
            if(each==null) break;
            inOrderTraversal(each,root2);
            if(flag){
                flag_in = true;
                break;
            }
        }
        return flag_in;
    }

    private boolean flag = true;

    private void inOrderTraversal(TreeNode root1,TreeNode root2){
        if(root2==null)return;
        if(root1==null||root1.val!=root2.val){
            flag = false;
            return;
        }
        inOrderTraversal( root1.left, root2.left);
        inOrderTraversal( root1.right, root2.right);
    }



}

 

代码已经ac

希望对大家有所帮助

以上

 

上一篇:leetcode 101. 对称二叉树(搜索)


下一篇:【剑指offer】树的子结构(JS实现)