Java获取两棵树相同的部分
在日常开发中,我们经常会遇到需要比较两个树结构是否相同的情况。在这种情况下,我们需要找出两棵树中相同的部分。本文将介绍如何使用Java来实现这一功能。
树的概念
在计算机科学中,树是一种非线性的数据结构,由若干个节点组成,节点之间通过边相连。树具有一个根节点,每个节点可以有零个或多个子节点。树的一个重要特性是每个节点都有且只有一个父节点,除了根节点外。
树的表示
在Java中,我们可以使用节点类来表示树。每个节点包含一个值和一个子节点列表。
class TreeNode {
int val;
List<TreeNode> children;
TreeNode(int val) {
this.val = val;
children = new ArrayList<>();
}
}
比较两棵树
为了比较两棵树的相同部分,我们可以采用递归的方式遍历这两棵树。具体步骤如下:
- 如果两个节点的值相同,则将这个节点添加到结果列表中。
- 遍历两个节点的子节点列表,对子节点递归调用比较函数。
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 |
---|---|
我们可以使用上面的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来获取两棵树相同的部分。首先我们定义了树节点的类,然后实现了一个递归函数来比较两棵树。最后,我们通过示例演示了如何使用这个函数来找出两棵树中相同的部分。希望本文对你有所帮助!