C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++の反転サブツリー


ソースとターゲットという2つの二分木があるとします。ターゲットのサブツリーになるように、ソースの反転Tがあるかどうかを確認する必要があります。つまり、すべての子孫を含むTと同じ値と構造のノードがターゲットにあることを意味します。

私たちが知っているように、次のいずれかの場合、ツリーは別のツリーの反転であると言われます-

  • 両方の木は空です

  • その左と右の子はオプションで交換され、その左と右のサブツリーは反転です。

したがって、入力がソースのようなものである場合

C++の反転サブツリー

ターゲット

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

  1. C++の二分木で最大値の根を数える

    二分木ルートがあるとします。その値がすべての子孫の値以上であるノードの数をカウントする必要があります。 したがって、入力が次のような場合 その場合、出力は3を除くすべてのノードとして4になり、基準を満たします。 これを解決するには、次の手順に従います- 関数dfs()を定義します。これはノードを取ります ノードがnullでない場合、- 0を返す l:=dfs(ノードの左側) r:=dfs(ノードの右側) =lとrの最大値の場合、- (retを1増やします) x:=ノードのvalの最大値、lおよびr xを返す メイン

  2. 二分木がC++の別の二分木のサブツリーであるかどうかを確認します

    2つの二分木があるとします。小さい方のツリーが別の二分木のサブツリーであるかどうかを確認する必要があります。これらの2本の木が与えられていると考えてください。 2本の木があります。 2番目のツリーは、最初のツリーのサブツリーです。このプロパティを確認するために、ポストオーダー方式でツリーをトラバースします。このノードをルートとするサブツリーが2番目のツリーと同一である場合、それはサブツリーです。 例 #include <bits/stdc++.h> using namespace std; class node {    public:   &