国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(十三):遞歸復制二叉樹(算法CopyTree)

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(十三):遞歸復制二叉樹(算法CopyTree)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

5.2.1 二叉樹

??二叉樹是一種常見的樹狀數(shù)據(jù)結(jié)構(gòu),它由結(jié)點的有限集合組成。一個二叉樹要么是空集,被稱為空二叉樹,要么由一個根結(jié)點和兩棵不相交的子樹組成,分別稱為左子樹右子樹。每個結(jié)點最多有兩個子結(jié)點,分別稱為左子結(jié)點和右子結(jié)點。
【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(十三):遞歸復制二叉樹(算法CopyTree),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,二叉樹,遞歸,c語言

二叉樹性質(zhì)

引理5.1:二叉樹中層數(shù)為i的結(jié)點至多有 2 i 2^i 2i個,其中 i ≥ 0 i \geq 0 i0。

引理5.2:高度為k的二叉樹中至多有 2 k + 1 ? 1 2^{k+1}-1 2k+1?1個結(jié)點,其中 k ≥ 0 k \geq 0 k0

引理5.3:設T是由n個結(jié)點構(gòu)成的二叉樹,其中葉結(jié)點個數(shù)為 n 0 n_0 n0?,度數(shù)為2的結(jié)點個數(shù)為 n 2 n_2 n2?,則有 n 0 = n 2 + 1 n_0 = n_2 + 1 n0?=n2?+1。

  • 詳細證明過程見前文:【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(三):二叉樹的定義、特點、性質(zhì)及相關證明

滿二叉樹、完全二叉樹定義、特點及相關證明

  • 詳細證明過程見前文:【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(四):滿二叉樹、完全二叉樹及其性質(zhì)

5.2.2 二叉樹順序存儲

??二叉樹的順序存儲是指將二叉樹中所有結(jié)點按層次順序存放在一塊地址連續(xù)的存儲空間中,詳見:
【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(五):二叉樹的順序存儲(初始化,插入結(jié)點,獲取父節(jié)點、左右子節(jié)點等)

5.2.3 二叉樹鏈接存儲

??二叉樹的鏈接存儲系指二叉樹諸結(jié)點被隨機存放在內(nèi)存空間中,結(jié)點之間的關系用指針說明。在鏈式存儲中,每個二叉樹結(jié)點都包含三個域:數(shù)據(jù)域(Data)、左指針域(Left)和右指針域(Right),用于存儲結(jié)點的信息和指向子結(jié)點的指針,詳見:
【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(六):二叉樹的鏈式存儲

5.2.4 二叉樹的遍歷

  • 遍歷(Traversal)是對二叉樹中所有節(jié)點按照一定順序進行訪問的過程。
  • 通過遍歷,可以訪問樹中的每個節(jié)點,并按照特定的順序?qū)λ鼈冞M行處理。
  • 對二叉樹的一次完整遍歷,可給出樹中結(jié)點的一種線性排序。
    • 在二叉樹中,常用的遍歷方式有三種:先序遍歷、中序遍歷后序遍歷
    • 這三種遍歷方式都可以遞歸地進行,它們的區(qū)別在于節(jié)點的訪問順序。
      • 在實現(xiàn)遍歷算法時,需要考慮遞歸終止條件和遞歸調(diào)用的順序。
    • 還可以使用迭代的方式來實現(xiàn)遍歷算法,使用?;蜿犃械葦?shù)據(jù)結(jié)構(gòu)來輔助實現(xiàn)。
  • 遍歷是二叉樹中基礎而重要的操作,它為其他許多操作提供了基礎,如搜索、插入、刪除等。
    【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(十三):遞歸復制二叉樹(算法CopyTree),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,二叉樹,遞歸,c語言

1-3 先序、中序、后序遍歷遞歸實現(xiàn)及相關練習

【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(七):二叉樹的遍歷(先序、中序、后序及其C語言實現(xiàn))

4. 中序遍歷非遞歸

【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(八):二叉樹的中序遍歷(非遞歸算法NIO)

5. 后序遍歷非遞歸

【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(九):二叉樹的后序遍歷(非遞歸算法NPO)

6. 先序遍歷非遞歸

【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(十):二叉樹的先序遍歷(非遞歸算法NPO)

7. 層次遍歷

【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(十一):二叉樹的層次遍歷(算法LevelOrder)

5.2.5 二叉樹的創(chuàng)建

  • 先序遍歷
    • a b d e f g c
  • 中序遍歷
    • d b f e g a c
  • 后序遍歷
    • d f g e b c a
  • 層次遍歷
    • a b c d e f g

先序創(chuàng)建

??由二叉樹的遍歷,很容易想到用遍歷方法去創(chuàng)建二叉樹,我們考慮從先根遍歷思想出發(fā)來構(gòu)造二叉樹。
??方法:輸入當前被創(chuàng)建結(jié)點的數(shù)據(jù)域的值,如果不空,申請空間用指針指向,然后對數(shù)據(jù)域進行賦值,再遞歸對該結(jié)點的左右指針域進行賦值,這就是先根創(chuàng)建過程。當輸入為空,則算法返回一個空指針(即空樹。遞歸出口)。
【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(十二):二叉樹的遞歸創(chuàng)建(算法CBT)

復制二叉樹

??考慮用后根遍歷思想遞歸復制二叉樹的算法CopyTree
【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(十三):遞歸復制二叉樹(算法CopyTree),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,二叉樹,遞歸,c語言

a. 算法CopyTree

【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(十三):遞歸復制二叉樹(算法CopyTree),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,二叉樹,遞歸,c語言

b. 時間復雜度

??設二叉樹有n個結(jié)點,算法CopyTree中,每個結(jié)點都要進行1次復制,即復制操作要執(zhí)行n次,每次復制都是常數(shù)級的操作,因此算法CopyTree的時間復雜度為O(n)。

c. 代碼實現(xiàn)

struct Node* CopyTree(struct Node* t) {
    if (t == NULL) {
        return NULL;
    }

    struct Node* p = createNode('\0');  // 創(chuàng)建新結(jié)點
    struct Node* newlptr = NULL;  // 初始化左指針
    struct Node* newrptr = NULL;  // 初始化右指針

    // 復制左子樹
    if (t->left != NULL) {
        newlptr = CopyTree(t->left);
    }

    // 復制右子樹
    if (t->right != NULL) {
        newrptr = CopyTree(t->right);
    }

    // 復制數(shù)據(jù)和指針
    p->data = t->data;
    p->left = newlptr;
    p->right = newrptr;

    return p;
}

代碼整合

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

// 二叉樹結(jié)點的定義
struct Node {
    char data;
    struct Node* left;
    struct Node* right;
};

// 創(chuàng)建新結(jié)點
struct Node* createNode(char data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    if (newNode == NULL) {
        printf("Memory allocation failed!\n");
        exit(1);
    }
    newNode->data = data;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

// 復制二叉樹
struct Node* CopyTree(struct Node* t) {
    if (t == NULL) {
        return NULL;
    }

    struct Node* p = createNode('\0');  // 創(chuàng)建新結(jié)點
    struct Node* newlptr = NULL;  // 初始化左指針
    struct Node* newrptr = NULL;  // 初始化右指針

    // 復制左子樹
    if (t->left != NULL) {
        newlptr = CopyTree(t->left);
    }

    // 復制右子樹
    if (t->right != NULL) {
        newrptr = CopyTree(t->right);
    }

    // 復制數(shù)據(jù)和指針
    p->data = t->data;
    p->left = newlptr;
    p->right = newrptr;

    return p;
}

// 中序遍歷二叉樹
void inorderTraversal(struct Node* root) {
    if (root != NULL) {
        inorderTraversal(root->left);
        printf("%c ", root->data);
        inorderTraversal(root->right);
    }
}
struct Node* CBT(char data[], int* index, char tostop) {
    char ch = data[(*index)++];
    if (ch == tostop) {
        return NULL;
    } else {
        struct Node* t = createNode(ch);
        t->left = CBT(data, index, tostop);
        t->right = CBT(data, index, tostop);
        return t;
    }
}

int main() {
    // 創(chuàng)建一棵二叉樹
    char tostop = '#';
    char input_data[] = {'a', 'b', 'd', '#', '#', 'e', 'f', '#', '#', 'g', '#', '#', 'c', '#', '#'};
    int index = 0;

    struct Node* original = CBT(input_data, &index, tostop);

    // 復制二叉樹
    struct Node* copy = CopyTree(original);

    // 中序遍歷并輸出原始二叉樹
    printf("Original Inorder Traversal: ");
    inorderTraversal(original);
    printf("\n");

    // 中序遍歷并輸出復制后的二叉樹
    printf("  Copied Inorder Traversal: ");
    inorderTraversal(copy);
    printf("\n");

    return 0;
}

【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(十三):遞歸復制二叉樹(算法CopyTree),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,二叉樹,遞歸,c語言文章來源地址http://www.zghlxwxcb.cn/news/detail-791401.html

到了這里,關于【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(十三):遞歸復制二叉樹(算法CopyTree)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 數(shù)據(jù)結(jié)構(gòu)_樹與二叉樹

    數(shù)據(jù)結(jié)構(gòu)_樹與二叉樹

    目錄 1. 樹的基本概念 1.1 樹的定義 1.2 基本術(shù)語 1.3 樹的性質(zhì) 1.4 相關練習 2. 二叉樹的概念 2.1 二叉樹的概念及其主要特性 2.2 二叉樹的存儲結(jié)構(gòu) 2.2.1 順序存儲結(jié)構(gòu) 2.2.2 鏈式存儲結(jié)構(gòu) 2.3 相關練習 3. 二叉樹的遍歷和線索二叉樹 3.1 二叉樹的遍歷 3.1.1 先序遍歷 3.1.2 中序遍歷 3.1

    2024年02月04日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(中)

    目錄 前言: 一、順序存儲結(jié)構(gòu): 二、堆: 1.堆的性質(zhì): 2.堆的性質(zhì): 3.堆的實現(xiàn): Ⅰ.堆的初始化: ?Ⅱ.堆的插入(含向上調(diào)整): ?Ⅲ.堆的刪除(含向下調(diào)整算法): Ⅳ.取堆頂?shù)臄?shù)據(jù): Ⅴ.堆中的數(shù)據(jù)個數(shù): Ⅵ.堆的判空: ?Ⅶ.堆的銷毀: 總結(jié): ? ? ? ? 上篇文章中,

    2024年02月16日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)與算法——樹與二叉樹

    數(shù)據(jù)結(jié)構(gòu)與算法——樹與二叉樹

    ??各位小伙伴久等了,本專欄新文章出爐了!??! 我又回來啦,接下來的時間里,我會持續(xù)把數(shù)據(jù)結(jié)構(gòu)與算法專欄更新完。 ??樹型結(jié)構(gòu)?? 是一類重要的 ?非線性數(shù)據(jù)結(jié)構(gòu) ,其中以樹和二叉樹最為常用,直觀來看,樹是以分支關系定義的層次結(jié)構(gòu)。樹型結(jié)構(gòu)在客觀世界中

    2024年02月11日
    瀏覽(16)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】樹與二叉樹

    【數(shù)據(jù)結(jié)構(gòu)與算法】樹與二叉樹

    除了之前我們講的棧、隊列、鏈表等線性結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)中還有著一對多的 非線性結(jié)構(gòu) ——— 樹 。 樹是有 n 個結(jié)點組成的有限集,當n=0時為空樹,在任意一顆非空樹中,有且僅有一個 特定的根結(jié)點 ;當n1時,其余結(jié)點又可以分為一棵樹,稱為根的 子樹 。 如下圖所示: A為

    2023年04月09日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)】24王道考研筆記——樹與二叉樹

    【數(shù)據(jù)結(jié)構(gòu)】24王道考研筆記——樹與二叉樹

    樹是n個結(jié)點的有限集合,n=0時,稱為空樹。非空樹滿足: 除了根節(jié)點外,任何一個結(jié)點都有且僅有一個前驅(qū) 結(jié)點的層次(深度):從上往下數(shù) 結(jié)點的高度:從下往上數(shù) 樹的高度(深度):總共有多少層 結(jié)點的度:有幾個孩子(分支) 樹的度:各節(jié)點的度的最大值 森林:

    2024年02月13日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu)與算法——樹與二叉樹篇詳解

    數(shù)據(jù)結(jié)構(gòu)與算法——樹與二叉樹篇詳解

    樹形結(jié)構(gòu)是一種非常重要的 非線性結(jié)構(gòu) ,樹形結(jié)構(gòu)中數(shù)據(jù)元素之間具有 一對多 的邏輯關系。 1.1.1 樹的定義 樹是由n(n=0)個結(jié)點所構(gòu)成的有限集合 當n=0時,稱為空樹 當n0時,n個結(jié)點滿足以下條件 有且僅有一個稱為根的結(jié)點 其余結(jié)點可分為m個互不相交的有限集合,且每一個

    2024年02月06日
    瀏覽(24)
  • 數(shù)據(jù)結(jié)構(gòu)之樹與二叉樹——算法與數(shù)據(jù)結(jié)構(gòu)入門筆記(五)

    數(shù)據(jù)結(jié)構(gòu)之樹與二叉樹——算法與數(shù)據(jù)結(jié)構(gòu)入門筆記(五)

    本文是算法與數(shù)據(jù)結(jié)構(gòu)的學習筆記第五篇,將持續(xù)更新,歡迎小伙伴們閱讀學習。有不懂的或錯誤的地方,歡迎交流 前面章節(jié)介紹的都是線性存儲的數(shù)據(jù)結(jié)構(gòu),包括數(shù)組、鏈表、棧、隊列。本節(jié)帶大家學習一種非線性存儲的數(shù)據(jù)結(jié)構(gòu),即樹(tree)。 不管是在面試時,還是日

    2024年02月08日
    瀏覽(46)
  • 數(shù)據(jù)結(jié)構(gòu)--》解鎖數(shù)據(jù)結(jié)構(gòu)中樹與二叉樹的奧秘(二)

    數(shù)據(jù)結(jié)構(gòu)--》解鎖數(shù)據(jù)結(jié)構(gòu)中樹與二叉樹的奧秘(二)

    ??????? 數(shù)據(jù)結(jié)構(gòu)中的樹與二叉樹,是在建立非線性數(shù)據(jù)結(jié)構(gòu)方面極為重要的兩個概念。它們不僅能夠模擬出生活中各種實際問題的復雜關系,還常被用于實現(xiàn)搜索、排序、查找等算法,甚至成為一些大型軟件和系統(tǒng)中的基礎設施。 ??????? 無論你是初學者還是進階者,

    2024年02月08日
    瀏覽(27)
  • 數(shù)據(jù)結(jié)構(gòu)--》解鎖數(shù)據(jù)結(jié)構(gòu)中樹與二叉樹的奧秘(一)

    數(shù)據(jù)結(jié)構(gòu)--》解鎖數(shù)據(jù)結(jié)構(gòu)中樹與二叉樹的奧秘(一)

    ????????數(shù)據(jù)結(jié)構(gòu)中的樹與二叉樹,是在建立非線性數(shù)據(jù)結(jié)構(gòu)方面極為重要的兩個概念。它們不僅能夠模擬出生活中各種實際問題的復雜關系,還常被用于實現(xiàn)搜索、排序、查找等算法,甚至成為一些大型軟件和系統(tǒng)中的基礎設施。 ??????? 無論你是初學者還是進階者

    2024年02月08日
    瀏覽(27)
  • 【數(shù)據(jù)結(jié)構(gòu)】樹與森林(樹的存儲結(jié)構(gòu)、森林與二叉樹的轉(zhuǎn)化、樹與森林的遍歷)

    【數(shù)據(jù)結(jié)構(gòu)】樹與森林(樹的存儲結(jié)構(gòu)、森林與二叉樹的轉(zhuǎn)化、樹與森林的遍歷)

    樹與二叉樹知識點文章: 【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(遞歸法先序、中序、后序、層次遍歷二叉樹、二叉樹的建立以及求樹高的方法) 二叉樹遍歷算法的應用: 【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹遍歷算法的應用(求葉子節(jié)點個數(shù)、求樹高、復制二叉樹、創(chuàng)建二叉樹、二叉樹存放表達式、

    2024年04月13日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包