中级农民
- 积分
- 155
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2014-4-17
- 最后登录
- 1970-1-1
|
duplicate substree,不知道有没有更好的方法
- public class DuplicateSubtree {
- static class Node {
- Node left, right;
- int val;
- public Node(int val) {
- this.val = val;
- }
- }
- public List<Node> getDuplicateSubtree(Node root) {
- List<Node> res = new ArrayList<Node>();
- if (root == null) {
- return res;
- }
- List<Node> nodes = new ArrayList<Node>();
- addNodes(root, nodes);
- HashSet<Node> set = new HashSet<Node>();
- for (int i = 0; i < nodes.size() - 1; i++) {
- for (int j = i + 1; j < nodes.size(); j++) {
- if (set.contains(nodes.get(i))) {
- break;
- }
- if (isSameTree(nodes.get(i), nodes.get(j))) {
- if (!set.contains(nodes.get(i))
- && !set.contains(nodes.get(j))) {
- res.add(nodes.get(i));
- }
- set.add(nodes.get(i));
- set.add(nodes.get(j));
- }
- }
- }
- return res;
- }
- private boolean isSameTree(Node node1, Node node2) {
- if (node1 == null && node2 == null) {
- return true;
- }
- if (node1 == null || node2 == null) {
- return false;
- }
- if (node1.val != node2.val) {
- return false;
- }
- return isSameTree(node1.left, node2.left)
- && isSameTree(node1.right, node2.right);
- }
- private void addNodes(Node root, List<Node> nodes) {
- if (root == null) {
- return;
- }
- nodes.add(root);
- addNodes(root.left, nodes);
- addNodes(root.right, nodes);
- }
-
- public static void main(String[] args) {
- Node root = new Node(1);
- root.left = new Node(2);
- root.right = new Node(3);
- root.left.left = new Node(4);
- root.right.left = new Node(2);
- root.right.right = new Node(4);
- root.right.left.left = new Node(4);
- DuplicateSubtree d = new DuplicateSubtree();
- List<Node> res = d.getDuplicateSubtree(root);
- for (Node node : res) {
- print(node);
- System.out.println();
- }
- }
- private static void print(Node node) {
- if (node == null) {
- return;
- }
- System.out.print(node.val + " ");
- print(node.left);
- print(node.right);
- }
- }
复制代码 |
|