判断两个节点是否是表兄弟

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Yonggie/article/details/89519445

注意啦,是“表兄弟”,不是一个爸爸的那种哦!

由于我比较笨,我想不出来一个用前序遍历或者后序遍历的做法。

好不容易才想到了,用层序遍历。

但是有很多细节很啰嗦!

显然,我们在同一层中,要是找到了指定的两个值,只要这两个值不是亲兄弟,那么就可以return true了。

之前没有这样子写过层序遍历,哎,还是我太水了!

这道题写了一个小时多。

思路形成才10分钟,debug了接近2小时。还是写程序能力不行啊!加油!

这种方法,虽然过了,但是效率比较低,beats 5%而已。

扫描二维码关注公众号,回复: 6125788 查看本文章

AC code:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isCousins(TreeNode* root, int x, int y) {
        if(!root) return false;
        int smaller=min(x,y);
        int bigger=max(x,y);
        //其实这句话可以不要,在while里面也有这个。防止是“亲兄弟”的情况
        if(!root->left||!root->right||(bigger==max(root->left->val,root->right->val))&&smaller==min(root->left->val,root->right->val)) return false;
        
        queue<TreeNode*> Q;
        Q.push(root->right);
        Q.push(root->left);
        //把一层的节点都取出来,然后遍历寻找指定的两个值,如果没找到,那么就继续在下一层找。
        while(!Q.empty()){
            vector<int> values;
            vector<TreeNode*> pointers;
            queue<TreeNode*> temp=Q;
            while(!temp.empty()) {
                if(temp.front()!=NULL){
                    if(temp.front()->left&&temp.front()->right){
                        if((smaller==min(temp.front()->left->val,temp.front()->right->val))&&(bigger==max(temp.front()->left->val,temp.front()->right->val))) return false;
                    }
                    values.push_back(temp.front()->val);
                    pointers.push_back(temp.front());
                }
                
                temp.pop();
            }
             for(int i=0;i<values.size();i++) cout<<values[i]<<" ";
             cout<<endl;
            
            bool f1=0,f2=0;
            for(int i=0;i<values.size();i++){
                if(values[i]==x) f1=1;
                if(values[i]==y) f2=1;
            }
            if(f1&&f2) return true;
            else if(f1&&!f2||!f1&&f2) return false;
            else{
                for(int i=0;i<values.size();i++){
                    if(pointers[i]->left) {Q.push(pointers[i]->left); }
                    if(pointers[i]->right) {Q.push(pointers[i]->right); }
                }
            }
        }
        
        
        return false;
    }
};

未完待续...

猜你喜欢

转载自blog.csdn.net/Yonggie/article/details/89519445