leetcode算法题 pro999 二叉树的堂兄弟节点
leetcode算法题 pro999 二叉树的堂兄弟节点
原题地址:https://leetcode-cn.com/problems/cousins-in-binary-tree/
题目内容
在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。
如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。
我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。
只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。
题目思路
使用深度搜索遍历二叉树,并且标记x和y的父节点和记录它们的深度,如果它们的深度相同并且父节点不相同,那么就是互为堂兄弟节点,反之,则不是。
代码
1 TreeNode p1 = null; 2 TreeNode p2 = null; 3 int floor1 = 0; 4 int floor2 = 0; 5 6 public static class TreeNode { 7 int val; 8 TreeNode left; 9 TreeNode right; 10 11 TreeNode() { 12 } 13 14 TreeNode(int val) { 15 this.val = val; 16 } 17 18 TreeNode(int val, TreeNode left, TreeNode right) { 19 this.val = val; 20 this.left = left; 21 this.right = right; 22 } 23 } 24 25 public void dfs(TreeNode root, TreeNode parent, int floor, int x, int y) { 26 if (root == null) return; 27 if (root.val == x) { 28 p1 = parent; 29 floor1 = floor; 30 } 31 if (root.val == y) { 32 p2 = parent; 33 floor2 = floor; 34 } 35 dfs(root.left, root, floor+1, x, y); 36 dfs(root.right, root, floor+1, x, y); 37 } 38 39 public boolean isCousins(TreeNode root, int x, int y) { 40 dfs(root, null, 1, x, y); 41 return (p1 != p2) && (floor1 == floor2); 42 }
其它思路
使用广度搜索遍历二叉树,同样地,标记x和y的父节点和记录它们的深度,如果它们的深度相同并且父节点不相同,那么就是互为堂兄弟节点,反之,则不是。
代码
1 class Solution { 2 // x 的信息 3 int x; 4 TreeNode xParent; 5 int xDepth; 6 boolean xFound = false; 7 8 // y 的信息 9 int y; 10 TreeNode yParent; 11 int yDepth; 12 boolean yFound = false; 13 14 public boolean isCousins(TreeNode root, int x, int y) { 15 this.x = x; 16 this.y = y; 17 18 Queue<TreeNode> nodeQueue = new LinkedList<TreeNode>(); 19 Queue<Integer> depthQueue = new LinkedList<Integer>(); 20 nodeQueue.offer(root); 21 depthQueue.offer(0); 22 update(root, null, 0); 23 24 while (!nodeQueue.isEmpty()) { 25 TreeNode node = nodeQueue.poll(); 26 int depth = depthQueue.poll(); 27 if (node.left != null) { 28 nodeQueue.offer(node.left); 29 depthQueue.offer(depth + 1); 30 update(node.left, node, depth + 1); 31 } 32 if (node.right != null) { 33 nodeQueue.offer(node.right); 34 depthQueue.offer(depth + 1); 35 update(node.right, node, depth + 1); 36 } 37 if (xFound && yFound) { 38 break; 39 } 40 } 41 42 return xDepth == yDepth && xParent != yParent; 43 } 44 45 // 用来判断是否遍历到 x 或 y 的辅助函数 46 public void update(TreeNode node, TreeNode parent, int depth) { 47 if (node.val == x) { 48 xParent = parent; 49 xDepth = depth; 50 xFound = true; 51 } else if (node.val == y) { 52 yParent = parent; 53 yDepth = depth; 54 yFound = true; 55 } 56 } 57 }