1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution { static private class Info { int xDepth; int yDepth; TreeNode xParent; TreeNode yParent; }
public boolean isCousins(TreeNode root, int x, int y) { Info info = new Info(); dfs(root, null, x, y, 0, info); if (info.xDepth == info.yDepth && info.xParent != info.yParent) { return true; } return false; }
private void dfs(TreeNode node, TreeNode parent, int x, int y, int depth, Info info) { if (node == null) { return; } if (node.val == x) { info.xDepth = depth; info.xParent = parent; } else if (node.val == y) { info.yDepth = depth; info.yParent = parent; } dfs(node.left, node, x, y, depth + 1, info); dfs(node.right, node, x, y, depth + 1, info); } }
|
DFS一遍, 来获得x和y的depth以及它们的parent.
时间复杂度: O(n)
空间复杂度: O(n)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| class Solution { public boolean isCousins(TreeNode root, int x, int y) { Queue<TreeNode> q = new LinkedList<>(); q.offer(root); while (!q.isEmpty()) { int size = q.size(); boolean foundX = false, foundY = false; for (int i = 0; i < size; i++) { TreeNode currNode = q.poll(); if (currNode.val == x) { foundX = true; } if (currNode.val == y) { foundY = true; } if (currNode.left != null && currNode.right != null) { if ((currNode.left.val == x && currNode.right.val == y) || (currNode.left.val == y && currNode.right.val == x)) { return false; } } if (currNode.left != null) { q.offer(currNode.left); } if (currNode.right != null) { q.offer(currNode.right); } } if (foundX && foundY) { return true; } else if (foundX || foundY) { return false; } } return false; } }
|
BFS的解法. 一开始我们level order traversal即可. 如果x和y都没发现, 那么继续. 如果只发现一个, 那么return false. 如果到了发现了x和y, 那么就说明…等等, 如果此时x和y同一个parent呢? 这就麻烦了. 如何捕捉到这种情况? 如果x和y是前后相邻被pop出? 这也不一定, 可能两个node有不同的parent但是pop出来时是相邻的. 于是这就增加了一个判定, 在我们判断当前node是x或者y后准备向queue中压入我们的children时, 我们要看一下如果自己两个child都不是null, 判断他俩不是一个x一个y, 如果是, 直接返回false, 否则就正常添加. 这样就cover到了x和y同属一个parent的情况.
时间复杂度: O(N) perfect binary tree
空间复杂度: O(N) perfect binary tree