給一個二元樹的根節,找出 x、y是否為cousin(同深度,不同父)。
遍歷所有的節,再把找到的x、y資料(深度,父節)做對比,就可以辨別是否為cousin 。
要找遍二元樹上的每一個元素,除了可以用遞迴函數,也可以用一層一層的stack(queue皆可)來找。由於每節的值不會重複,不用擔心多個可能。
就效率來看,這題的情況單純,儘可能減少判斷,才是通往高效之路。
Python
class Solution:
def isCousins(self, root: TreeNode, x: int, y: int) -> bool:
def search(node, parent, depth, val):
if not node: return None, None
if node.val == val:
return parent, depth
else:
res = search(node.left, node, depth+1, val)
if res[0]: return res
return search(node.right, node, depth+1, val)
nodeX = search(root, None, 0, x)
nodeY = search(root, None, 0, y)
return (nodeX[0] != nodeY[0] and nodeX[1] == nodeY[1])
C#
public class Solution {
public bool IsCousins(TreeNode root, int x, int y) {
var queue = new Queue();
var memo = new Dictionary();
queue.Enqueue(root);
memo[root.val] = root;
while(queue.Count > 0)
{
int len = queue.Count;
for(int i = 0; i < len; i++)
{
var node = queue.Dequeue();
if(!(node.left is null))
{
memo[node.left.val] = node;
queue.Enqueue(node.left);
}
if(!(node.right is null))
{
memo[node.right.val] = node;
queue.Enqueue(node.right);
}
}
var hasX = memo.ContainsKey(x);
var hasY = memo.ContainsKey(y);
if(hasX | hasY)
{
if(hasX & hasY)
{
if(memo[x] != memo[y])
return true;
else
break;
}
else
{
break;
}
}
}
return false;
}
}