标签:|| 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 };
标签:|| span tree node 核心 mic div str tree false
原文地址:https://www.cnblogs.com/ocpc/p/12822200.html