自己做的第一个想到的还是BFS... 代码又臭又长效率还低..
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isCousins(TreeNode root, int x, int y) {
Queue<Node> queue = new LinkedList<>();
queue.offer(new Node(root, null, 0));
int levelX = -1, parentX = -1, levelY = -2, parentY = -1;
while (!queue.isEmpty()) {
Node node = queue.poll();
if (node.n.val == x) {
levelX = node.level;
parentX = node.parent == null ? -1 : node.parent.val;
}
if (node.n.val == y) {
levelY = node.level;
parentY = node.parent == null ? -1 : node.parent.val;
}
if (levelX == levelY) { //x和y都找到了,且在同一排
if (parentX != parentY) { //父节点不一样,true
return true;
}
return false; //父节点一样,false
}
if (node.n.left != null) {
queue.offer(new Node(node.n.left, node.n, node.level + 1));
}
if (node.n.right != null) {
queue.offer(new Node(node.n.right, node.n, node.level + 1));
}
}
if (levelX == levelY) {
return true;
}
return false;
}
class Node{
TreeNode n;
TreeNode parent;
int level;
Node(TreeNode n, TreeNode parent, int level) {
this.n = n;
this.parent = parent;
this.level = level;
}
}
}
又是别人家的DFS... 代码简洁容易理解效率高..
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int xLevel, xParent,yLevel,yParent;
public boolean isCousins(TreeNode root, int x, int y) {
dfs(root.left, 1, x, y, root);
dfs(root.right, 1, x, y, root);
return xLevel == yLevel && xParent != yParent; //level相同且paren不同
}
void dfs(TreeNode node, int level, int x, int y, TreeNode parent){
if (node == null) {
return;
}
if (node.val == x) {
xLevel = level;
xParent = parent.val;
}
if (node.val == y) {
yLevel = level;
yParent = parent.val;
}
dfs(node.left, level + 1, x, y, node);
dfs(node.right, level + 1, x, y, node);
}
}