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 }

 

官方题解网址:https://leetcode-cn.com/problems/cousins-in-binary-tree/solution/er-cha-shu-de-tang-xiong-di-jie-dian-by-mfh2d/

posted @ 2021-05-17 20:21  TidalCoast  阅读(62)  评论(0编辑  收藏  举报