码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-05-03 16:28:55      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:||   span   tree node   核心   mic   div   str   tree   false   

题目:

技术图片

 

 

 

解答:

很简单题目,核心就是层序遍历。

如果一个节点的左右左孩子出现空的情况,则用INT_MIN来代替左右孩子节点值,并将左右孩子节点压入队列,这么做的目的只是为了方便我们判断。【类似满二叉树一样对待】

如果在某一深度的搜索结果:

(1)x, y都没有找到,则进行下一深度的查找
(2)x, y只找到一个,则直接return false
(3)x, y两个都找到了,现在需要判断他们出现的位置。
  A. 如果他们出现的位置之间相隔距离大于1,则可以说明他们的父节点不是同一个
  B. 如果他们出现的位置之间相隔距离刚好等于1,那么只要较大位置索引为偶数即说明他们的父节点不是同一个
  C. 否则 return false

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     bool isCousins(TreeNode* root, int x, int y) 
13     {
14         if(!root) 
15         {
16             return false;
17         }
18 
19         queue<TreeNode*> q;
20         q.push(root);
21         while(!q.empty())
22         {
23             int size = q.size();
24             vector<int> v(size);
25 
26             for(int i = 0; i<size; ++i)
27             {
28                 root = q.front(); 
29                 q.pop();
30                 v[i] = root ? root->val : INT_MIN;
31                 if(root)
32                 { 
33                     q.push(root->left); 
34                     q.push(root->right); 
35                 }
36             }
37 
38             // 判断是否出现堂兄弟
39             int index_x = -1;
40             int index_y = -1;
41             for(int i = 0; i<size; ++i)
42             {
43                 if(v[i] == x) 
44                 {
45                     index_x = i;
46                 }
47                 else if(v[i] == y) 
48                 {
49                     index_y = i;
50                 }
51             }
52             // 没有找到
53             if(index_x == -1 && index_y == -1);
54             // 只找到一个
55             else if(index_x == -1 || index_y == -1) 
56             {
57                 return false;
58             }
59             // 都找到
60             else
61             {
62                 // 相隔距离超过1
63                 if(abs(index_x - index_y) > 1 ) 
64                 {
65                     return true;
66                 }
67                 // 相邻节点
68                 else if( (max(index_x, index_y) & 1) == 0) 
69                 {
70                     return true;
71                 }
72                 else
73                 {
74                     return false;
75                 }
76             }
77         }
78         return false;
79     }
80 };

 

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

标签:||   span   tree node   核心   mic   div   str   tree   false   

原文地址:https://www.cnblogs.com/ocpc/p/12822200.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!