树的子结构

来源:互联网 发布:背单词软件 编辑:程序博客网 时间:2024/05/18 18:52

题:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

思路:首先要判定B是不是A的子结构。则需要判断B的根节点是否存在于A里面。这个很好写,直接递归遍历树A找出节点值等于B的根节点值的节点即可。

找到之后需要匹配B和从A中找出的这个节点是否一样,如果不一样,再从当前节点的左右子树一直找,找到后再匹配。一直重复查找-匹配这两步直到匹配成功或者遍历完A树为止。

怎么匹配呢。当然也是递归。依次匹配找到的节点和树B的左右子树,在遍历到树B的叶子节点之前,如果有节点的值不匹配,直接返回false。

代码:

/**public class TreeNode {    int val = 0;    TreeNode left = null;    TreeNode right = null;    public TreeNode(int val) {        this.val = val;    }}*/public class Solution {    public boolean HasSubtree(TreeNode root1,TreeNode root2) {        if(root1 == null || root2 == null)            return false;        TreeNode node = findNode(root1, root2);        while (node != null){            // 如果匹配成功,结束查找            if(equalsNode(node, root2))                return true;            else {                // 匹配不成功,继续查找                TreeNode n = findNode(node.left, root2);                // 再匹配                if(equalsNode(n, root2))                    return true;                // 匹配不成功,再查找                node = findNode(node.right, root2);            }        }        return false;    }    public TreeNode findNode(TreeNode node1, TreeNode node2){        if(node1 == null || node2 == null)            return null;        TreeNode node;        // 查找成功        if(node1.val == node2.val) {            return node1;        }else {            // 查找不成功,从左子树开始继续查找            node = findNode(node1.left, node2);            if(node != null)                return node;            // 左子树没找到,再从右子树开始查找            node = findNode(node1.right, node2);        }        return node;    }    public boolean equalsNode(TreeNode node1, TreeNode node2){        // 如果B树已经到叶子节点,说明匹配成功        if(node2 == null)            return true;        // 如果A数已经到叶子节点,说明匹配失败        if(node1 == null)            return false;        if(node1.val != node2.val)            return false;        // 继续匹配树的下一层左右子树        return equalsNode(node1.left, node2.left) && equalsNode(node1.right, node2.right);    }}

呕心沥血写出来的,转载请一定注明出处!

原创粉丝点击