入口からACまでの二分木(1)建設と前、中、後の横断

名詞の解釈と性質

最初の引用Baidu百科事典:これ
ここに画像の説明を挿入します
はすぐに使用される例を理解するための写真です:
ここに画像の説明を挿入します

1.二分木を構築する方法

#include<stdio.h>
#include<stdlib.h>

typedef struct BTNode
{
    
    
    int data;
    struct BTNode *Left;
    struct BTNode *Right;
}Node;


//创建二叉树,按前序输入
Node* createBTree()
{
    
    
    Node *p;
    int ch;
	//printf("输入data");
    scanf("%d",&ch);
    if(ch == 0)     //如果到了叶子节点,接下来的左、右子树分别赋值为0
    {
    
    
        p = NULL;
    }
    else
    {
    
    
        p = (Node*)malloc(sizeof(Node));
        p->data = ch;
        p->Left  = createBTree();  //递归创建左子树
        p->Right = createBTree();  //递归创建右子树
    }
    return p;
}
int main()
{
    
    
	int i;
    Node *root = NULL;
    root = createBTree();
 return 0;
 }

これは、プレオーダー入力に従ってダブルポインタリンクリストで構築された二分木です。リンクリストは単なる保存方法であることがわかります。二分木のトラバースの順序(および入力の順序)は次のとおりです。本当の焦点。
前のシーケンス:例として1245367
、入力が1 2 4(リーフノード)0 0 5(リーフノード)0 0 3 6(リーフノード)00 7(リーフノード)00の場合

次に、二分木の最初、中間、最後の走査

トラバーサルの順序

トラバーサルとは、バイナリツリーの各ノードを特定の
順序でトラバースすることです。シーケンスには次の3種類があります。

(1)フロント(1次)オーダートラバーサル(左右のルート)

(2)順序どおりの走査(左ルート右)

(3)ポストオーダートラバーサル(左右のルート)

したがって、二分木に直面すると、上記のルールに従って、最初、中間、最後のトラバーサルを再帰的に書き込むことができます。
栗を与える:ここに画像の説明を挿入します

はじめに:ABDECFG
はルートの左から右に再帰的であるため、最初にルートAとその左の子ノードおよび右の子ノードを書き込みます
ABC;
ここに画像の説明を挿入します

次に再帰を開始します。Bがルートの場合、Bの後に左右の子ノードDとEを追加し
ますAB DE C;
ここに画像の説明を挿入します

Cがルートの場合、C
AB DE C FGの後に左右の子ノードFGを追加します
。DFEGのには子ノードがなく、再帰的な終了は上記のトラバーサルの結果であるためです。
ここに画像の説明を挿入します

中次の方法は上記のとおりです。最初にBACを書き込み
、左ルートと右ルートに従ってBを追加し
ますDBE AC;
Cの最終ソリューションを追加し
ますDBEAFCG;

次のシーケンスは上記と同じです:
BCA;
DEBCA;
DEBFGCA;
ソリューションを取得します。
任意の二分木は上記のように再帰的に記述でき、この再帰的な方法は後続のアルゴリズムで引き続き使用されます。

高度な質問とサンプルの質問

コードを使用して二分木の順序を見つける方法?二分木
プレオーダーとミドルオーダーで確認し、ポストオーダーを順番に見つける
ことができます。ミドルオーダーとポストオーダーで確認、プレオーダーを見つけることもできますが、
それだけです。プレオーダーとポストオーダーの場合、バイナリツリーを構築することは不可能です。
例を使用して説明します。
入力:
2行でそれぞれプレオーダーとミドルオーダーを入力
出力:
ポストオーダーを出力

アイデア:二分木を急いで構築する必要はありません。プレオーダーとミドルオーダーでは、ツリー自体は配列にのみ存在しますが、上記のルールに従って確立されています。言い換えれば、データ構造として、二分木の本当の意味合いは、それを格納するためにポインタリンクリストを無情に使用するのではなく、その順序にあります。
次に、プレオーダーはルートの左と右、ミドルオーダーは左ルートの右、最初にプレオーダー(プレオーダーの最初のルート)からルートを見つけ、ミドルオーダーのこのルートの左側が左のサブツリーであり、右側が右側のサブツリーである場合は、上記の再帰を実行してノードを出力します。
素人の言葉で誤解を説明してください。再帰的に出力してから、最初の出力がDFSの最も深い結果であり、最後の出力が現在の結果です。
前の順序ABCを例にとると、中間の順序はBACです。後の順序を見つけるには、最初にルートAを見つけます。中間の順序では、Aの左側がBで、右側がCで、Bに再帰的です。 、サブツリー出力なし、Cに再帰的、サブツリー出力なし、再帰的完全出力A。
コード:

#include<stdio.h>
#include<string.h>
char a[28],b[28];
void dfs(int w,int x,int y,int z)//深搜
{
    
    int i=0,j=0;
    if(w>x||y>z)//无法继续递归时
return;
for(i=w;i<=x;i++)
    if(a[i]==b[y])//在中序中找到根
{
    
    dfs(w,i-1,y+1,y+i-w);//递归左子树
dfs(i+1,x,y+i-w+1,z);//递归右子树
        printf("%c",a[i]);//递归完后输出,注意,是递归完
}
}
int main()
{
    
    
int i=0,j=0,k=0;
scanf("%s",b);//输入前序
scanf("%s",a);//输入中序
j=strlen(a);
k=strlen(b);
dfs(0,j-1,0,k-1);//进入递归
    return 0;
}

dfsと二分木に関しては、DFSと順列と組み合わせ
で言及されていましたが、当時、二分木はストレージ構造というよりも論理的な判断構造に似ていました。
時間があるときに再度更新します。

おすすめ

転載: blog.csdn.net/weixin_43736127/article/details/113797972