题目:
BFS详解
bfs深度判断就很简单了,只要是同一层遍历的即可,但是父节点判断是个麻烦事,我们可以通过遍历pair中存入父节点以及当前结点即可。
class Solution {
public:
//整体思路:用队列存储的不仅仅是该层的结点,而是存储一个映射关系,即该层结点的上一个父节点是谁也得知道。
bool isCousins(TreeNode* root, int x, int y) {
//该变量用于存储,当我们在一个层中寻找到其中一个值后,其对应的父节点
//如果该值不为nullptr时,则说明已经找到了其中一个值,而这里面存储的就是那个值的父节点
//所以再次在同一层碰到另一个值,我们只需要判断res与该值父节点不要是同一个就行了
TreeNode* res = nullptr;
queue<pair<TreeNode *, TreeNode *>> St;
St.push({ nullptr, root });
while (!St.empty()) {
for (int i = St.size(); i > 0; i--) {
auto [p, q] = St.front();
St.pop();
//当该层出现其中一个值,开始相关判断
if (q->val == x || q->val == y) {
if (res != nullptr && res != p) return true;
res = p;
}
//把父节点和子节点的映射入栈
if (q->left) {
St.push({ q, q->left });
}
if (q->right) {
St.push({ q, q->right });
}
}
//如果出现res != nullptr,则说明该层出现了其中一个值,或者两个值都出现了,但是为同一父节点。
//这说明这两个值对应的结点不可能为堂兄弟结点了,return false即可
if (res) return false;
}
return false;
}
};
DFS详解
对dfs而言,由于是通过函数递归实现,那么我们可以通过函数传参为所欲为。
class Solution {
private:
//通过全局变量更新用于查看要寻找的数字的相应层数,以及相应的父节点
int depthX = -1,depthY = -1;
TreeNode *xParent = nullptr,*yParent = nullptr;
//通过dfs搜索更新相应的参数
void dfs(TreeNode* root,TreeNode* parent,int depth,int x,int y){
if(!root)
return;
if(root->val == x){
depthX = depth;
xParent = parent;
}
if(root->val == y){
depthY = depth;
yParent = parent;
}
//剪枝,如果两个值对应的参数都得到了更新,直接进行剪枝
if(xParent&&yParent&&depthX!=-1&&depthY!=-1)
return;
//左右两边继续分治
dfs(root->left,root,depth+1,x,y);
dfs(root->right,root,depth+1,x,y);
}
public:
bool isCousins(TreeNode* root, int x, int y) {
dfs(root,nullptr,0,x,y);
//只有当两个参数更新,且满足父节点不同深度相同,才能return true,否则都是false
if(xParent&&yParent&&depthX!=-1&&depthY!=-1){
if(xParent!=yParent&&depthY==depthX)
return true;
}
return false;
}
};