马上就要过年了,yeah,yeah,yeah
车票候补到了,yeah, yeah, yeah~~~
题目不贴了,思路如下。
要看俩节点是不是表姐妹,那么,如果使用层次遍历的话,这俩节点一定在同一层。需要是表的,不是亲的话,母亲必须不是同一个。
1 二叉树层次遍历,使用先进先出队列。
我用的java
,所以数据结构使用LinkedList
即可。
初始化:LinkedList<TreeNode> queue = new LinkedList<>();
进: queue.addLast(node)
出: queue.removeFirst()
2 表姐妹一定在同一层,可以把每一层的节点数存起来,如果该层有x
或y
,那么在该层结束前,应该存在另一个,否在x
和y
不在同一层。
用到辅助变量
num
:记录当前层的节点数,每访问一个,--num
,直到num
为0
,表示当前层访问结束。
temp
:记录下一层的节点数,每当新节点加到队列,++temp
,直到当前层访问完,则下一层的节点数确定,将temp
赋值给num
,且temp
清0
flag
:初始值为false
,当访问到x
或y
后,置为true
。如果再访问到x
或y
且flag=true
,则证明是第二次访问到了。
3 表姐妹,不能为亲姐妹。所以不能有同一个母亲。且是从左到右依次访问,所以当访问到当前节点的右孩子节点是第二次访问到x
或y
,再去判断左孩子是否为x
或y
即可。
代码如下
public boolean isCousins(TreeNode root, int x, int y) {
LinkedList<TreeNode> queue = new LinkedList<>();
queue.addLast(root);
//num代表当前访问层的节点个数。temp为下一层的个数
int num = 1, temp = 0;
boolean flag = false;
while (queue.size() > 0) {
TreeNode node = queue.removeFirst();
--num;
//下一层的节点入队列
if (node.left != null) {
++temp;
queue.addLast(node.left);
// 左孩子节点是x,或y
if (node.left.val == x || node.left.val == y) {
//flag=true,代表已经访问过,这是第二次访问。
if (flag) {
// 因为此时还没访问到右孩子节点,所以不会是同一个母亲,所以直接返回true
return true;
} else {
flag = true;
}
}
}
if (node.right != null) {
++temp;
queue.addLast(node.right);
if (node.right.val == x || node.right.val == y) {
//flag=true,代表已经访问过,这是第二次访问。因为是右孩子,所以左孩子不能是x或y
if (flag && (node.left == null || (node.left.val != x && node.left.val != y))) {
return true;
} else {
flag = true;
}
}
}
// num = 0代表该层访问完毕。
if (num == 0) {
if (flag) {
return false;
}
num = temp;
temp = 0;
}
}
return false;
}