leetcode 993【二叉树的堂兄弟节点】
这道题给出二叉树root,x和y,要解决的问题是在树中找到x和y,并且确定它们是否为堂兄弟节点的关系。
题目链接
https://leetcode-cn.com/problems/cousins-in-binary-tree/
解题思路与代码思路:
队列实现、BFS
广度优先遍历每一层,存入队列中,判断x和y是否在同一层,如果在,就是判断是否为堂兄弟节点。在同一层中,只有相邻节点并且右边的节点的索引为奇数、左边节点索引为偶数时,才是同一个父节点。如果不满足上面条件,则就是堂兄弟节点
递归DFS
深度优先搜索标记每一个节点,对于每个节点,都存储它的父亲节点和深度到对应的字典中,最后判断x和y在这两个字典中的值就可以了
代码:
BFS法
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution(object):
def isCousins(self,root,x,y):
ans = [root]
while ans:
tmp = [] # 存储本层的所有值
n = len(ans) # 每次循环拿一层的数组
for i in range(n): #这个循环把所有节点值存入tmp,然后ans存入每个点的左右孩子
r = ans.pop(0) #每一个节点
if r:
tmp.append(r.val)
ans.append(r.left) #秘诀在这里,把左右孩子放回去
ans.append(r.right)
else:
tmp.append(None) #如果是空结点,方便判断是否为同一父节点
print(tmp)
if x in tmp and y in tmp:
left = tmp.index(x) #获取x的索引位置
right = tmp.index(y)
if left>right: # l比r大,调整一下,方便判断,保证r比l大
left,right=right,left
if right-1 == left and right%2 != 0 :
#只有l,r相邻并且r为奇数时(l为偶数),才是同一父节点
return False
return True
return False
t = TreeNode(val=1,left=TreeNode(val=2,left=TreeNode(4),right=TreeNode(5)),right=TreeNode(val=3,left=TreeNode(6),right=TreeNode(7)))
s = Solution()
s.isCousins(t,5,7)
DFS递归
class Solution(object):
def isCousins(self,root,x,y):
parent = {} #节点的值对应它的parent
depth = {} # 节点值对应它的深度
def dfs(node,par=None):
if node:
depth[node.val] = 1+ depth[par.val] if par else 0
parent[node.val] = par
dfs(node.left,node)
dfs(node.right,node)
dfs(root)
return depth[x]==depth[y] and parent[x] != parent[y]
复 杂 度 分 析 : \color{red}{复杂度分析:} 复杂度分析:
- BFS
- 时间复杂度: 看看x和y在哪一层吧,到那一层的最大节点数, O(K)
- 空间复杂度: O(K)
- DFS
- 时间复杂度: O(N) , N为树的节点数量
- 空间复杂度: O(N)