993.二叉树的堂兄弟节点

148 阅读1分钟

题目:
在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。

如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点

我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。

只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false
算法:
方法一:bfs
注意判断两个节点是否有相同父节点的方法,不能用index差距为1来判断

func isCousins(root *TreeNode, x int, y int) bool {
	arr := make([]*TreeNode, 0)
	arr = append(arr, root)
	xIndex, yIndex := -1, -1
	pos := 0
	for len(arr) != 0 {
		n := len(arr)
		for i := 0; i < n; i++ {
			if arr[i] != nil {
				if arr[i].Val == x {
					xIndex = i
				}
				if arr[i].Val == y {
					yIndex = i
				}

				arr = append(arr, arr[i].Left)
				arr = append(arr, arr[i].Right)
				
			}
		}
		if xIndex >= 0 && yIndex >= 0 {
			// 同父节点意味着他们的index差距等于1
			// [10,1,2,3,4,5,6]
			// 4
			// 5
			return getFather(pos + xIndex) != getFather(pos + yIndex)
		}
		if xIndex >= 0 || yIndex >= 0 {
			return false
		}
		arr = arr[n:]
		pos = pos + n
	}
	return false
}

func abs(a, b int) int {
	if a > b {
		return a - b
	}
	return b - a
}

func getFather(index int) int {
	if index == 0 {
		return 0
	}
	return (index - 1) / 2
}