二叉树的堂兄弟节点
在二叉树中,根节点位于深度0处,每个深度为k的节点的子节点位于深度k+1处。如果二叉树的两个节点深度相同,但父节点不同,则它们是一对堂兄弟节点。我们给出了具有唯一值的二叉树的根节点root,以及树中两个不同节点的值x和y。只有与值x和y对应的节点是堂兄弟节点时,才返回true。否则,返回false。
示例 1:
输入:root = [1,2,3,4], x = 4, y = 3
输出:false
示例 2:
输入:root = [1,2,3,null,4,null,5], x = 5, y = 4
输出:true
思路
- 在本题中,两个不同节点的x和y,要保证父母不同,深度相同。因此,设置四个全局变量分别设置x的深度和父母,y的深度和父母。
- 从根节点开始遍历,然后在遍历的过程中维护上面的四个参数,一旦出现x或y的值,则更新上面的参数。遍历结束后,判断x的父母和y的父母是否相等,x的深度和y的深度是否相等。
解法
type TreeNode struct { // 二叉树的结构
Val int
Left *TreeNode
Right *TreeNode
}
var xdep,ydep,xpar,ypar int // 定义全局变量
func isCousins(root *TreeNode, x int, y int) bool {
dfs(root.Left,x,y,1,root.Val) // 从二叉树的左子树去寻找是否存在x或y
dfs(root.Right,x,y,1,root.Val) //从二叉树的右子树去寻找是否存在x或y
return xdep==ydep&&xpar!=ypar //判断条件:x和y的深度相同,父母的数值不同
}
func dfs(node *TreeNode,x int,y int,depth int,par int){
if node==nil{ //如果为空,则不返回
return
}
if node.Val==x{ //如果当前节点的值为x,则更新x的全局变量x的深度和父母
xdep=depth
xpar=par
}else if node.Val==y{ // 如果当前节点的值为y,则更新y的全局变量y的深度和父母
ydep=depth
ypar=par
}else{ // 如果当前的节点不等于x或y,则继续从当前节点的左右子树递归寻找
dfs(node.Left,x,y,depth+1,node.Val)
dfs(node.Right,x,y,depth+1,node.Val)
}
}