C++の反転サブツリー
私たちが知っているように、次のいずれかの場合、ツリーは別のツリーの反転であると言われます-
-
両方の木は空です
-
その左と右の子はオプションで交換され、その左と右のサブツリーは反転です。
したがって、入力がソースのようなものである場合
ターゲット
その場合、出力はTrueになります
これを解決するには、次の手順に従います-
-
関数check()を定義します。これには、node1、node2、
が必要です。 -
node1とnode2の両方がnullの場合、-
-
trueを返す
-
-
node1またはnode2のいずれかがnullの場合、-
-
falseを返す
-
-
node1のvalがnode2のvalと等しくない場合、-
-
falseを返す
-
-
op1:=check(node1の左側、node2の左側)およびcheck(node1の右側、node2の右側)
-
op2:=check(node1の右側、node2の左側)およびcheck(node1の左側、node2の右側)
-
op1とop2の少なくとも1つがtrueの場合にtrueを返します
-
関数solve()を定義します。これは、ソース、ターゲット、
を取ります。 -
ソースとターゲットが空の場合、-
-
trueを返す
-
-
ソースまたはターゲットのいずれかがnullの場合、-
-
falseを返す
-
-
op1:=check(target、source)
-
op1がtrueの場合、-
-
trueを返す
-
-
少なくとも1つのsolve(ソース、ターゲットの左側)またはsolve(ソース、ターゲットの右側)がtrueの場合にtrueを返します
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h>
using namespace std;
class TreeNode {
public:
int val;
TreeNode *left, *right;
TreeNode(int data) {
val = data;
left = NULL;
right = NULL;
}
};
class Solution {
public:
bool check(TreeNode* node1, TreeNode* node2){
if(!node1 && !node2)
return true;
if(!node1 || !node2)
return false;
if(node1->val != node2->val) {
return false;
}
bool op1 = check(node1->left, node2->left) && check(node1->right, node2->right);
bool op2 = check(node1->right, node2->left) && check(node1->left, node2->right);
return op1 || op2;
}
bool solve(TreeNode* source, TreeNode* target) {
if(!target && !source)
return true;
if(!target || !source)
return false;
bool op1 = check(target, source);
if(op1)
return true;
return solve(source, target->left) || solve(source, target->right);
}
};
main(){
Solution ob;
TreeNode *target = new TreeNode(6);
target->left = new TreeNode(3);
target->right = new TreeNode(1);
target->right->left = new TreeNode(3);
target->right->right = new TreeNode(2);
target->right->right->left = new TreeNode(4);
TreeNode *source = new TreeNode(1);
source->left = new TreeNode(2);
source->right = new TreeNode(3);
source->left->right = new TreeNode(4);
cout << (ob.solve(source, target));
} 入力
TreeNode *target = new TreeNode(6); target->left = new TreeNode(3); target->right = new TreeNode(1); target->right->left = new TreeNode(3); target->right->right = new TreeNode(2); target->right->right->left = new TreeNode(4); TreeNode *source = new TreeNode(1); source->left = new TreeNode(2); source->right = new TreeNode(3); source->left->right = new TreeNode(4);
出力
1
-
C++の二分木で最大値の根を数える
二分木ルートがあるとします。その値がすべての子孫の値以上であるノードの数をカウントする必要があります。 したがって、入力が次のような場合 その場合、出力は3を除くすべてのノードとして4になり、基準を満たします。 これを解決するには、次の手順に従います- 関数dfs()を定義します。これはノードを取ります ノードがnullでない場合、- 0を返す l:=dfs(ノードの左側) r:=dfs(ノードの右側) =lとrの最大値の場合、- (retを1増やします) x:=ノードのvalの最大値、lおよびr xを返す メイン
-
二分木がC++の別の二分木のサブツリーであるかどうかを確認します
2つの二分木があるとします。小さい方のツリーが別の二分木のサブツリーであるかどうかを確認する必要があります。これらの2本の木が与えられていると考えてください。 2本の木があります。 2番目のツリーは、最初のツリーのサブツリーです。このプロパティを確認するために、ポストオーダー方式でツリーをトラバースします。このノードをルートとするサブツリーが2番目のツリーと同一である場合、それはサブツリーです。 例 #include <bits/stdc++.h> using namespace std; class node { public: &