データ構造とアルゴリズムの基礎 (Wang Zhuo) (20): バイナリ トラバーサル思考の応用 (バイナリ ツリーの構築 (DLR プリオーダー トラバーサル、再帰アルゴリズム)、バイナリ ツリーのコピー、バイナリ ツリーの深さの検出、バイナリ ツリーのノード数の検出バイナリ ツリー、バイナリ ツリーの検索 (リーフ ノードの数) とスレッド バイナリ ツリー

目次

アプリケーション操作の概要: 

前提条件:

バイナリ ツリーを作成します。

入れ子:

バイナリツリーのコピー

バイナリ ツリーの深さを求めます (次のアルゴリズムは少し難しいです。詳細を読む)

バイナリ ツリー内のノードの数を見つける

二分木の葉ノードの数を見つける

スレッドバイナリツリー


アプリケーション操作の概要: 

バイナリツリーの確立(DLRプリオーダートラバーサル、再帰アルゴリズム)

バイナリツリーのコピー

二分木の深さを求める

二分木内のノードの数を見つける
二分木内の葉ノードの数を見つける

もっと自分で書いてください(必ず手書きしてください) 


前提条件:

#include<iostream>
using namespace std;
 
typedef int Status;
#define MAXTSIZE 100
 
typedef char TElemtype;//Tree Elemtype
//根据需求情况修改
typedef TElemtype SqBiTree;//sequence binary tree
//binary:二进制的; 二元的; 由两部分组成的;
SqBiTree bt;//binary tree
 
struct BiNode//二叉链表存储结构
{
	TElemtype data;
	struct
		BiNode* lchild, * rchild;
	//左右孩子指针
};
typedef BiNode * BiTree;
 
struct TriNode//trinary:三元的
{
	TElemtype data;
	struct
		BiNode* lchild, * rchild,* parent;
};
typedef TriNode* TriTree;
 
int main()
{
 
}

バイナリ ツリーを作成します。

Status CreatBiTree(BiTree& T)
{
    char input;
    cin >> input;
    if (input == '#')
        return false;
    T = new BiNode;  
    T->data = input;//D
    CreatBiTree(T->lchild);//L
      //嵌套
    CreatBiTree(T->rchild);//R
      //嵌套
    return true;
}

入れ子:

呼び出しが実行される前に、別の呼び出し層が適用され、
ネスト内の次の呼び出し層が実行された後、
プログラムは先頭に戻り、ネストされた (オナニー人形) ステートメントの作成を開始し、
実行を続けます。

バイナリツリーのコピー

int Copy(BiTree T, BiTree& NewT)
{
    if (T == NULL)
    {
        NewT = NULL;
        return 0;
    }
    else
    {
        NewT = new BiNode;
        NewT->data = T->data;
        Copy(T->lchild, NewT->lchild);
        Copy(T->rchild, NewT->rchild);
    }
    return 1;
}

&はリターンパスを意味しますか?? 仮引数、実引数、ポインタはどちらも戻り転送を表すものではないでしょうか?


バイナリ ツリーの深さを求めます (次のアルゴリズムは少し難しいです。詳細を読む)

int Depth(BiTree& T)
{
    if (T == NULL)
        return 0;
    else
    {
        int m = Depth(T->lchild);
        int n = Depth(T->rchild);
        if (m > n)
            return m + 1;
        else
            return n + 1;
    }
}

バイナリ ツリー = ルート ノード + 左のサブツリー + 右のサブツリー;

右サブツリー = ルート ノード + 左サブツリー + 右サブツリー

左のサブツリー = ルート ノード + 左のサブツリー + 右のサブツリー...というサイクルが繰り返されます。

アイデア: 入れ子のアイデア、第一原則 (不可能な機能を実現するための解体と単純化)

複雑な二分木演算の問題を解決する

単一ノードのバイナリ ツリー (リーフ ノード) 問題の累積に分解します (再帰関数を使用してバイナリ ツリーを層ごとに分解します)


バイナリ ツリー内のノードの数を見つける

int NodeCount(BiTree T)//有点难度,多看看
{
    if (T == NULL)
        return 0;
    else
        return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}


二分木の葉ノードの数を見つける

int LeafNodeCount(BiTree T)
{
    if (T == NULL)
        return 0;
    if (T->lchild == NULL && T->rchild == NULL)
        return 1;
    else
        return LeafNodeCount(T->lchild) + LeafNodeCount(T->rchild);
}

スレッドバイナリツリー

構造定義:

struct BiThrNode
	//Threaded binary tree:线索二叉树
{
	int data;
	int ltag, rtag;
	struct BiTrNode* lchild, * rchild;
};
typedef BiThrNode * BiThrTree;

糸:

通した; 通した; 通した; 通した; 通した; 通した; 通した

おすすめ

転載: blog.csdn.net/Zz_zzzzzzz__/article/details/129740137
おすすめ