剑指Offer--面试题18:数的子结构--Java实现

来源:互联网 发布:淘宝怎么分期买电脑 编辑:程序博客网 时间:2024/05/16 14:51

题目描述:
输入两颗二叉树A和B,判断B是不是A的子结构。

解题思路:
要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:第一步在树A中找到和树B的根结点的值一样的结点R,第二步再判断树A中以R为根结点的子树是不是包含和B一样的结构。

通常我们都会采用递归的方式,但是这里需要注意的检查边界条件,即空指针。

代码如下:

public class HasSubTreeTest {    static class Node{        int key;        Node left;        Node right;        Node(int key){            this.key = key;        }    }    public static boolean hasSubTree(Node root1, Node root2){        boolean result = false;        if(root1 != null && root2 != null){            result = doesTreeHaveTree2(root1, root2);            if(!result){                result = hasSubTree(root1.left, root2);            }            if(!result){                result = hasSubTree(root1.right, root2);            }        }        return result;    }    private static boolean doesTreeHaveTree2(Node root1, Node root2) {        if(root2 == null){            return true;         }        if(root1 == null){            return false;        }        if(root1.key != root2.key){            return false;        }        return doesTreeHaveTree2(root1.left, root2.left) && doesTreeHaveTree2(root1.right, root2.right);    }    public static void main(String[] args) {        Node root1 = new Node(8);        Node node8 = new Node(8);        Node node7 = new Node(7);        root1.left = node8;        root1.right = node7;        Node node9 = new Node(9);        node8.left = node9;        Node node2 = new Node(2);        node8.right = node2;        Node node4 = new Node(4);        Node node72 = new Node(7);        node2.left = node4;        node2.right = node72;        Node root2 = new Node(8);        Node node92 = new Node(9);        Node node22 = new Node(2);        root2.left = node92;        root2.right = node22;        System.out.println(hasSubTree(root1, root2));    }}

代码中的测试案列:
A:
这里写图片描述
B:
这里写图片描述

0 0
原创粉丝点击