प्रौद्योगिकी साझेदारी

एल्गोरिदम् प्रश्नानां द्वाचत्वारिंशत् अभिलेखान् कटौतीं कर्तुं प्रयतते [101. सममितद्विचक्रीयवृक्षः, 100. समानवृक्षः, 572. अन्यस्य वृक्षस्य उपवृक्षः

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

प्रस्तावना

Binary Tree अध्याये द्विचक्रीयवृक्षाणां संचालनस्य अभ्यासं आरभत ।
अभिलेख ४२ [१०१.सममित द्विचक्रीय वृक्ष].
अनुवर्तते।


1. विषयपठनम्

द्विचक्रीयवृक्षस्य मूलग्रन्थिमूलं ददातु, अक्षीयसममितं वा इति पश्यन्तु

उदाहरणम् १ : १.
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

输入:root = [1,2,2,3,4,4,3]
输出:true
  • 1
  • 2

उदाहरणम् २ : १.
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

输入:root = [1,2,2,null,3,null,3]
输出:false
  • 1
  • 2

संकेत:

树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100
  • 1
  • 2

उन्नतम् : भवन्तः उपयोक्तुं शक्नुवन्तिपुनरावृत्तिः पुनरावृत्तिः चएतस्याः समस्यायाः समाधानस्य द्वौ उपायौ?


2. साक्षात्कारं कर्तुं प्रयतस्व

विचारः १

प्रथमं पुनरावृत्तिः उपयुज्यताम् । कोरः - अक्षीयसमरूपतायाः न्यायार्थं के मापदण्डाः सन्ति ?

पुनरावृत्तिः - स्वयमेव आह्वयतु।अद्यापि द्वितीयकं तर्कं न प्राप्तम्

  • वाम==दक्षिणः निर्धारयतु? उपवृक्षस्य प्रवेशः अशुद्धः अस्ति ।
  • वाम उपवृक्षः वामं, केन्द्रं, दक्षिणं उपवृक्षं दक्षिणं, वामं, केन्द्रं गच्छति। क्रमाः समानाः सन्ति वा ? परन्तु तत् सम्पूर्णस्य वृक्षस्य कृते। उपवृक्षस्य प्रवेशः अपि दोषः ।

विचारः २

परिवर्तनार्थं पुनरावर्तनीयपद्धतेः उपयोगं कुर्वन्तु। स्तर-क्रम-यात्रायाः उपयोगं कुर्वन्तु ।
स्तरक्रमफलं प्राप्त्वा प्रत्येकं स्तरं समसङ्ख्या अस्ति, विपरीतपश्चात् समानं च इति न्याय्यते । परन्तु उदाहरणार्थं द्वौ, एतत् सत्यं नास्ति यतः शून्यसूचकः बहिष्कृतः अस्ति ।
विचारः कार्यं न करोति।

सारांशः - १.यद्यपि वयं जानीमः यत् समरूपतां अन्वेष्टव्या अस्ति तथापि समरूपतायाः न्यायार्थं अस्माकं एकीकृतः मानकः नास्ति ।


3. सन्दर्भविचाराः

सन्दर्भलिङ्कः

शिक्षण सामग्री

  • अक्षीयसमरूपता : मूलग्रन्थिस्य वामदक्षिणउपवृक्षौ समानौ भवितुं प्लवितुं शक्यते वा ? , कथं तुलना?
  • व्याख्यानात् प्राप्तम्सम्यक् विचारः: अस्मिन् भ्रमणार्थं मूलग्रन्थेः वाम-उपवृक्षः, मूल-ग्रन्थिः दक्षिण-उपवृक्षः च आवश्यकः भवति ।युगपत् भ्रमणं कुर्वन्तु . एकदा एव उपवृक्षद्वयं भ्रमित्वा एव वयं न्याययितुं शक्नुमः यत् उभयतः ग्रन्थिः समानाः सन्ति वा इति ।
    • प्रथमं वाम-उपवृक्षस्य वामभागं दक्षिण-उपवृक्षस्य दक्षिणभागं च गच्छन्तु अस्मिन् समये बाह्य-ग्रन्थिः समानाः इति न्याय्यन्ते;
    • ततः वाम उपवृक्षस्य दक्षिणं दक्षिणं उपवृक्षस्य वामं च गच्छन्तु अस्मिन् समये अन्तः ग्रन्थिः समाना इति न्याय्यते;
    • उभयप्रत्यागमनानन्तरं तौ एकस्मिन् समये सत्यौ भवतः, समरूपतां सूचयति ।
  • भ्रमणक्रमं निर्धारयन्तु : वामः, दक्षिणः, केन्द्रः। वामबालकं संसाधित्वा पुनः दक्षिणबालकं संसाधित्वा परिणामं मध्यनोड् प्रति प्रत्यागच्छतु ।
  • कार्यान्वयनस्य प्रयासःविचारानाम् अपर्याप्तता : केवलं मूलनोडस्य वाम-उपवृक्षं संसाधयन्तु, मूलनोडस्य दक्षिण-उपवृक्षस्य क्रमः वाम-उपवृक्षात् भिन्नः इति ज्ञातव्यम् । भवन्तः ट्रैवर्सल् क्रमं प्लवन् एकीकृतं तर्कं प्राप्तुं न शक्नुवन्ति, अथवा यत्किमपि।

पुनरावर्तनीय कार्यान्वयन

प्रत्येकं टिप्पणी विचारः एव।

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool iscompare(TreeNode* left,TreeNode* right){ //两边同时遍历,所以两个参数。返回是否相等,用bool类型。
        //确定终止条件
        if(!left && !right) return true;    //同时为空,可以翻转
        else if(!left && right) return false; //一个空,一个不为空。肯定不等
        else if (!right && left) return false;//一个空,一个不为空。肯定不等
        else if(left->val != right->val) return false;//都不为空,但是值不等

        //都不为空,值相等。说明可以继续进行外侧比较、内侧比较,不用return。
        bool outside = iscompare(left->left,right->right);  //同时比较,解决了左右遍历顺序不一样
        bool inside = iscompare(left->right,right->left);
        return outside && inside;   //同时返回true。才能返回true
    }
    bool isSymmetric(TreeNode* root) {
        return iscompare(root->left,root->right);
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

वृक्षस्य (वाम-उपवृक्षस्य) भ्रमणक्रमः वाम-केन्द्रः, वृक्षस्य (दक्षिण-उपवृक्षस्य) भ्रमणक्रमः दक्षिण-वाम-केन्द्रः च भवति ।

पुनरावर्तनीयः विचारः १

  • मूलग्रन्थिस्य वाम उपवृक्षं मूलग्रन्थिस्य दक्षिण उपवृक्षं च युगपत् संसाधयन्तु । पूर्वपरिभ्रमणात् भिन्नम् ।
  • कतारसंरचनायाः उपयोगं कुर्वन्तु: putतुलना कर्तव्यौ नोडौ एकस्मिन् समये पङ्क्तौ स्थापितौ भवतः,पुनःएकस्मिन् समये बहिः निष्कासयतु . निष्कासितौ नोडौ प्लवितुं शक्यते वा इति निर्धारयतु । अतः यदि वामदक्षिणबालाः स्वतन्त्राः सन्ति तर्हि तान् अपि पङ्क्तौ स्थापनीयम्।
  • stack structure इत्यस्य उपयोगं कुर्वन्तु: अद्यापि एकस्मिन् समये द्वौ नोडौ संसाधितुं आवश्यकौ । उपमाकरणीयौ विषयौ स्तः ।एकस्मिन् समये स्थापयित्वा एकस्मिन् समये बहिः निष्कासयतु

पुनरावर्तनीयं कार्यान्वयनम् [कतारसंरचना] ।

स्तम्भसंरचना अपि तथैव भवति ।

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(!root) return false;
        queue<TreeNode*> que;
        que.push(root->left);//放入左子树
        que.push(root->right);//放入右子树
        while(!que.empty()){
            TreeNode* left = que.front(); que.pop();//取出比较对象中的左节点
            TreeNode* right = que.front();que.pop();//取出比较对象中的右节点

            if(!left && !right){    //都是空节点
                continue;
            }else if(!left || !right || left->val != right->val){
                return false;
            }

            que.push(left->left);
            que.push(right->right);
            que.push(left->right);
            que.push(right->left);
        }
        return true;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

सारांश [अक्षसममित द्विचक्रीय वृक्ष]: .

  • अद्यापि भ्रमणम् एव, परन्तु भेदः अस्ति यत् :उपवृक्षद्वयं युगपत् भ्रमितव्यम् . कस्मिन् अपि उपवृक्षे गभीरं पुनरावृत्तिः न सम्यक् ।
  • सत्यं निर्धारयितुं वस्तुनां तुलनायाः शर्ताः: उभयम् अपि रिक्तम् अस्ति; शेषाः मिथ्या भवन्ति।
  • न च कस्यचित् उपवृक्षस्य पुनरावर्तनीयं भ्रमणं कर्तुं शक्यते, यतः वामदक्षिणयोः क्रमः भिन्नः भवति ।
  • न तु स्तरक्रमपरिभ्रमणम् । यदि भवता क्रमेण स्तराः भ्रमितव्याः सन्ति तर्हि : प्रत्येकस्य स्तरस्य परिणामान् प्राप्नुवन्तु तथा च विपर्यययन्तु यत् ते समानाः सन्ति वा इति । यथा (न अनुशंसितम्) उपरिष्टाद् उत्तराणि सर्वाणि अतीव उत्तमाः सन्ति।
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        vector<vector<int>> level;
        queue<TreeNode*> que;
        if(!root) return false;
        que.push(root);
        while(!que.empty()){
            int size = que.size();
            vector<int> vec;
            while(size--){
                TreeNode* cur = que.front();que.pop();
                if(cur){ //不是空节点
                    que.push(cur->left);
                    que.push(cur->right);
                    vec.push_back(cur->val);
                }else{
                    vec.push_back(INT_MIN);//因为节点的值【-100,100】。用一个最小值代表空。
                }
            }
            level.push_back(vec);
        }
        //获得层序遍历。包含空。空的数值借助INT_MIN代替。
        for(int i = 1;i < level.size();i++){
            vector<int> temp = level[i];
            reverse(temp.begin(),temp.end());
            if(temp != level[i]){
                return false;
            }
        }
        return true;

    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

प्रश्नाभ्यासः

【100.एक एव वृक्षः】

1. शीर्षकम्

द्वयोः द्विचक्रीयवृक्षयोः मूलनोड् p तथा q दत्त्वा वृक्षद्वयं समानं वा इति परीक्षितुं फंक्शन् लिखन्तु ।

यदि वृक्षद्वयम्संरचनात्मकरूपेण समानाः तथा च ग्रन्थिनां मूल्यानि समानानि सन्ति, ते समानाः स्मृताः ।

उदाहरणम् १ : १.

输入:p = [1,2,3], q = [1,2,3]
输出:true
  • 1
  • 2

उदाहरणम् २ : १.

输入:p = [1,2], q = [1,null,2]
输出:false
  • 1
  • 2

उदाहरणम् ३ : १.

输入:p = [1,2,1], q = [1,1,2]
输出:false
  • 1
  • 2

संकेत:

两棵树上的节点数目都在范围 [0, 100] 内
-10^4 <= Node.val <= 10^4
  • 1
  • 2

विचाराः

द्वौ वृक्षौ समानौ वा इति निर्धारयतु। संरचना समाना मूल्यानि च समानानि सन्ति।

  • अथ अवश्यम्यदा वृक्षद्वयं एकस्मिन् समये संसाधितं भवति तदा एव तुलनावस्तु भवितुम् अर्हति । . वृक्षे केवलं गभीररूपेण भ्रमितुं/किमपि कार्यं कर्तुं व्यर्थम्।
  • [101. सममित द्विचक्रीयवृक्षः] इत्यस्मात् भेदाः, तुलनावस्तूनि।अत्रतुलनावस्तुनः वामबालकस्य वामबालकस्य तुलना भवति; . पुनरावर्तनीय-आह्वानस्य मापदण्डाः दत्ताः सन्ति ।

संहिता

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if(!p && !q) return true;  //传入节点同时为空,可以对应
        else if(!p && q) return false;//一个空,另一个不是空。不可能对应。
        else if(p && !q) return false;//一个空,另一个不是空。不可能对应。
        else if(p->val != q->val) return false;//值不等,不可能对应。

        bool leftchild = isSameTree(p->left,q->left); 
        bool rightchild = isSameTree(p->right,q->right);
        return leftchild && rightchild;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

【572.अन्यवृक्षस्य उपवृक्षः】

विषय

भवद्भ्यः द्वौ द्विचक्रीयवृक्षौ root, subRoot च दत्तौ स्तः ।root contains and subRoot has इति पश्यन्तुसमानसंरचना तथा नोड् मूल्यानि उपवृक्षः । यदि वर्तते तर्हि सत्यं प्रत्यागच्छति अन्यथा, मिथ्या प्रत्यागच्छति ।

द्विचक्रीयवृक्षस्य उपवृक्षे वृक्षस्य एकः ग्रन्थिः अस्य नोडस्य सर्वे वंशजग्रन्थिः च समाविष्टाः भवन्ति । वृक्षः स्वस्य उपवृक्षत्वेन अपि द्रष्टुं शक्यते ।

उदाहरणम् १ : १.

输入:root = [3,4,5,1,2], subRoot = [4,1,2]
输出:true
  • 1
  • 2

उदाहरणम् २ : १.

输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
输出:false
  • 1
  • 2

संकेत:

root 树上的节点数量范围是 [1, 2000]
subRoot 树上的节点数量范围是 [1, 1000]
-10^4 <= root.val <= 10^4
-10^4 <= subRoot.val <= 10^4
  • 1
  • 2
  • 3
  • 4

विचाराः

(1) उपवृक्षाः अपि द्वौ वृक्षौ समानौ न्याययन्ति। समानतानिर्णयस्य समाधानार्थं भवान् [100. प्रश्नसंहिता कार्यान्वयनम्] इत्यस्य उपयोगं कर्तुं शक्नोति ।
(२) मूले तु अवश्यमेव द्रष्टव्यम्subRoot root node मूल्यस्य बराबरम् नोडः उपवृक्षस्य मूलग्रन्थिः इति । स्तरक्रमस्य उपयोगेन मूलं भ्रमन्तु ।

संहिता

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSame(TreeNode* rootnode,TreeNode* subRootnode){
        if(!rootnode && !subRootnode) return true;
        else if(!rootnode && subRootnode) return false;
        else if(rootnode && !subRootnode) return false;
        else if(rootnode->val != subRootnode->val) return false;

        bool leftchild = isSame(rootnode->left,subRootnode->left);
        bool rightchild = isSame(rootnode->right,subRootnode->right);
        return leftchild && rightchild;
    }
    bool isSubtree(TreeNode* root, TreeNode* subRoot) {
        //先找到和subRoot值相等的节点,才有可能相等。得遍历root找到和subRoot值相等的节点,可能作为子树的根节点

        //用层序遍历
        queue<TreeNode*> que;
        que.push(root);
        while(!que.empty()){
            int size = que.size();
            while(size--){
                TreeNode* cur = que.front();que.pop();
                if(cur->val == subRoot->val){
                    bool subtree = isSame(cur,subRoot);
                    if(subtree) return true;
                }
                if(cur->left) que.push(cur->left);
                if(cur->right) que.push(cur->right);
            }
        }
        return false;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

सम्पूर्ण पाठ सारांश

कोरः - तुलनावस्तुं निर्धारयितुं एकस्मिन् समये द्वौ वृक्षौ पारं कुर्वन्तु। पुनरावर्तनीयं कार्यान्वयनम् कुर्वन्तु।

न गभीरवृक्षभ्रमणं वस्तुनः उभयपक्षस्य तुलनां न प्राप्स्यति ।

(शुद्धिकरणस्य स्वागतम्, पुनः मुद्रणकाले स्रोतः सूचयन्तु)