2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Binary Tree अध्याये द्विचक्रीयवृक्षाणां संचालनस्य अभ्यासं आरभत ।
अभिलेख ४२ [१०१.सममित द्विचक्रीय वृक्ष].
अनुवर्तते।
द्विचक्रीयवृक्षस्य मूलग्रन्थिमूलं ददातु, अक्षीयसममितं वा इति पश्यन्तु。
उदाहरणम् १ : १.
输入:root = [1,2,2,3,4,4,3]
输出:true
उदाहरणम् २ : १.
输入:root = [1,2,2,null,3,null,3]
输出:false
संकेत:
树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100
उन्नतम् : भवन्तः उपयोक्तुं शक्नुवन्तिपुनरावृत्तिः पुनरावृत्तिः चएतस्याः समस्यायाः समाधानस्य द्वौ उपायौ?
प्रथमं पुनरावृत्तिः उपयुज्यताम् । कोरः - अक्षीयसमरूपतायाः न्यायार्थं के मापदण्डाः सन्ति ?
पुनरावृत्तिः - स्वयमेव आह्वयतु।अद्यापि द्वितीयकं तर्कं न प्राप्तम्:
परिवर्तनार्थं पुनरावर्तनीयपद्धतेः उपयोगं कुर्वन्तु। स्तर-क्रम-यात्रायाः उपयोगं कुर्वन्तु ।
स्तरक्रमफलं प्राप्त्वा प्रत्येकं स्तरं समसङ्ख्या अस्ति, विपरीतपश्चात् समानं च इति न्याय्यते । परन्तु उदाहरणार्थं द्वौ, एतत् सत्यं नास्ति यतः शून्यसूचकः बहिष्कृतः अस्ति ।
विचारः कार्यं न करोति।
सारांशः - १.यद्यपि वयं जानीमः यत् समरूपतां अन्वेष्टव्या अस्ति तथापि समरूपतायाः न्यायार्थं अस्माकं एकीकृतः मानकः नास्ति ।。
प्रत्येकं टिप्पणी विचारः एव।
/**
* 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);
}
};
वृक्षस्य (वाम-उपवृक्षस्य) भ्रमणक्रमः वाम-केन्द्रः, वृक्षस्य (दक्षिण-उपवृक्षस्य) भ्रमणक्रमः दक्षिण-वाम-केन्द्रः च भवति ।
स्तम्भसंरचना अपि तथैव भवति ।
/**
* 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;
}
};
/**
* 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;
}
};
द्वयोः द्विचक्रीयवृक्षयोः मूलनोड् p तथा q दत्त्वा वृक्षद्वयं समानं वा इति परीक्षितुं फंक्शन् लिखन्तु ।
यदि वृक्षद्वयम्संरचनात्मकरूपेण समानाः तथा च ग्रन्थिनां मूल्यानि समानानि सन्ति, ते समानाः स्मृताः ।
उदाहरणम् १ : १.
输入:p = [1,2,3], q = [1,2,3]
输出:true
उदाहरणम् २ : १.
输入:p = [1,2], q = [1,null,2]
输出:false
उदाहरणम् ३ : १.
输入:p = [1,2,1], q = [1,1,2]
输出:false
संकेत:
两棵树上的节点数目都在范围 [0, 100] 内
-10^4 <= Node.val <= 10^4
द्वौ वृक्षौ समानौ वा इति निर्धारयतु। संरचना समाना मूल्यानि च समानानि सन्ति।
/**
* 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;
}
};
भवद्भ्यः द्वौ द्विचक्रीयवृक्षौ root, subRoot च दत्तौ स्तः ।root contains and subRoot has इति पश्यन्तुसमानसंरचना तथा नोड् मूल्यानि उपवृक्षः । यदि वर्तते तर्हि सत्यं प्रत्यागच्छति अन्यथा, मिथ्या प्रत्यागच्छति ।
द्विचक्रीयवृक्षस्य उपवृक्षे वृक्षस्य एकः ग्रन्थिः अस्य नोडस्य सर्वे वंशजग्रन्थिः च समाविष्टाः भवन्ति । वृक्षः स्वस्य उपवृक्षत्वेन अपि द्रष्टुं शक्यते ।
उदाहरणम् १ : १.
输入:root = [3,4,5,1,2], subRoot = [4,1,2]
输出:true
उदाहरणम् २ : १.
输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
输出:false
संकेत:
root 树上的节点数量范围是 [1, 2000]
subRoot 树上的节点数量范围是 [1, 1000]
-10^4 <= root.val <= 10^4
-10^4 <= subRoot.val <= 10^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;
}
};
कोरः - तुलनावस्तुं निर्धारयितुं एकस्मिन् समये द्वौ वृक्षौ पारं कुर्वन्तु। पुनरावर्तनीयं कार्यान्वयनम् कुर्वन्तु।
न गभीरवृक्षभ्रमणं वस्तुनः उभयपक्षस्य तुलनां न प्राप्स्यति ।
(शुद्धिकरणस्य स्वागतम्, पुनः मुद्रणकाले स्रोतः सूचयन्तु)