【LeetCode】993. 二叉树的堂兄弟节点

222 阅读2分钟

二叉树的堂兄弟节点

在二叉树中,根节点位于深度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)
    }
}