Java获取两棵树相同的部分

在日常开发中,我们经常会遇到需要比较两个树结构是否相同的情况。在这种情况下,我们需要找出两棵树中相同的部分。本文将介绍如何使用Java来实现这一功能。

树的概念

在计算机科学中,树是一种非线性的数据结构,由若干个节点组成,节点之间通过边相连。树具有一个根节点,每个节点可以有零个或多个子节点。树的一个重要特性是每个节点都有且只有一个父节点,除了根节点外。

树的表示

在Java中,我们可以使用节点类来表示树。每个节点包含一个值和一个子节点列表。

class TreeNode {
    int val;
    List<TreeNode> children;

    TreeNode(int val) {
        this.val = val;
        children = new ArrayList<>();
    }
}

比较两棵树

为了比较两棵树的相同部分,我们可以采用递归的方式遍历这两棵树。具体步骤如下:

  1. 如果两个节点的值相同,则将这个节点添加到结果列表中。
  2. 遍历两个节点的子节点列表,对子节点递归调用比较函数。
public List<TreeNode> findCommonNodes(TreeNode root1, TreeNode root2) {
    List<TreeNode> result = new ArrayList<>();
    findCommonNodesHelper(root1, root2, result);
    return result;
}

private void findCommonNodesHelper(TreeNode node1, TreeNode node2, List<TreeNode> result) {
    if (node1 == null || node2 == null) {
        return;
    }

    if (node1.val == node2.val) {
        result.add(node1);
    }

    for (int i = 0; i < Math.min(node1.children.size(), node2.children.size()); i++) {
        findCommonNodesHelper(node1.children.get(i), node2.children.get(i), result);
    }
}

示例

假设有两棵树如下所示:

树1 树2
Tree1 Tree2

我们可以使用上面的findCommonNodes方法来找出这两棵树中相同的部分:

TreeNode root1 = new TreeNode(1);
TreeNode node1 = new TreeNode(2);
TreeNode node2 = new TreeNode(3);
root1.children.add(node1);
root1.children.add(node2);

TreeNode root2 = new TreeNode(1);
TreeNode node3 = new TreeNode(2);
TreeNode node4 = new TreeNode(4);
root2.children.add(node3);
root2.children.add(node4);

List<TreeNode> commonNodes = findCommonNodes(root1, root2);

在上面的示例中,commonNodes列表将包含节点值为2的节点,因为这是两棵树中唯一相同的节点。

类图

下面是表示树节点的类图:

classDiagram
    class TreeNode {
        int val
        List<TreeNode> children
    }

总结

通过本文的介绍,我们学习了如何使用Java来获取两棵树相同的部分。首先我们定义了树节点的类,然后实现了一个递归函数来比较两棵树。最后,我们通过示例演示了如何使用这个函数来找出两棵树中相同的部分。希望本文对你有所帮助!