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

11. 數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)

這篇具有很好參考價(jià)值的文章主要介紹了11. 數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

上一節(jié),簡(jiǎn)單概述了樹(shù)這種數(shù)據(jù)結(jié)構(gòu),以及樹(shù)結(jié)構(gòu)向下,具有某些一些特征的樹(shù),比如二叉樹(shù),B樹(shù),B+樹(shù),堆等。其中,二叉樹(shù)是一個(gè)很重要的模塊。也是在一些技術(shù)面試中,可能會(huì)問(wèn)到的問(wèn)題。本節(jié),我們就二叉樹(shù),做詳細(xì)介紹。

1. 存儲(chǔ)

二叉樹(shù)是一個(gè)邏輯結(jié)構(gòu),底層可以用數(shù)組或者鏈表存儲(chǔ)。

1.1 數(shù)組存儲(chǔ)

使用數(shù)組存儲(chǔ)時(shí),會(huì)按照層級(jí)順序把二叉樹(shù)的節(jié)點(diǎn)放到數(shù)組中對(duì)應(yīng)的位置上。如果某一個(gè)節(jié)點(diǎn)的左孩子或右孩子空缺,則數(shù)組的相應(yīng)位置也空出來(lái)。
11. 數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)
由此,可以得出結(jié)論:在用數(shù)組存儲(chǔ)時(shí),

  1. 一個(gè)父節(jié)點(diǎn)的下標(biāo)是n,那么它的左孩子節(jié)點(diǎn)下標(biāo)就是2×n+1、右孩子節(jié)點(diǎn)下標(biāo)就是2x(n+1)
  2. 對(duì)于一個(gè)稀疏的二叉樹(shù)(孩子不滿)來(lái)說(shuō),用數(shù)組表示法是非常浪費(fèi)空間的
  3. 所以二叉樹(shù)一般用鏈表存儲(chǔ)實(shí)現(xiàn)。(二叉堆除外,因?yàn)?strong>二叉堆是一個(gè)完全二叉樹(shù),節(jié)點(diǎn)基本都是滿的)

1.2 鏈表存儲(chǔ)

在使用鏈表存儲(chǔ)時(shí),二叉樹(shù)的每個(gè)節(jié)點(diǎn)至少包含三部分:

  1. 存儲(chǔ)數(shù)據(jù)的data變量
  2. 指向左孩子的left指針
  3. 指向右孩子的right指針

如下圖所示:
11. 數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)

2. 遍歷

二叉樹(shù),是典型的非線性數(shù)據(jù)結(jié)構(gòu),遍歷時(shí)需要把非線性關(guān)聯(lián)的節(jié)點(diǎn)轉(zhuǎn)化成一個(gè)線性的序列,以不同的方式來(lái)遍歷,遍歷出的序列順序也不同。

2.1 深度優(yōu)先遍歷

所謂深度優(yōu)先,就是偏向于縱深,“一頭扎到底”的訪問(wèn)方式。

2.1.1 前序遍歷

二叉樹(shù)的前序遍歷,輸出順序是根節(jié)點(diǎn)、左子樹(shù)、右子樹(shù)。
11. 數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)
步驟如下:

  1. 首先輸出的是根節(jié)點(diǎn)1
  2. 由于根節(jié)點(diǎn)1存在左孩子,輸出左孩子節(jié)點(diǎn)2
  3. 由于節(jié)點(diǎn)2也存在左孩子,輸出左孩子節(jié)點(diǎn)4
  4. 節(jié)點(diǎn)4既沒(méi)有左孩子,也沒(méi)有右孩子,那么回到節(jié)點(diǎn)2,輸出節(jié)點(diǎn)2的右孩子節(jié)點(diǎn)5
  5. 節(jié)點(diǎn)5既沒(méi)有左孩子,也沒(méi)有右孩子,那么回到節(jié)點(diǎn)1,輸出節(jié)點(diǎn)1的右孩子節(jié)點(diǎn)3
  6. 節(jié)點(diǎn)3沒(méi)有左孩子,但是有右孩子,因此輸出節(jié)點(diǎn)3的右孩子節(jié)點(diǎn)6
    到此為止,所有的節(jié)點(diǎn)都遍歷輸出完畢

2.1.2 中序遍歷

二叉樹(shù)的中序遍歷,輸出順序是左子樹(shù)、根節(jié)點(diǎn)、右子樹(shù)。
11. 數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)
步驟如下:

  1. 首先訪問(wèn)根節(jié)點(diǎn)的左孩子,如果這個(gè)左孩子還擁有左孩子,則繼續(xù)深入訪問(wèn)下去,一直找到不再有左孩子 的節(jié)點(diǎn),并輸出該節(jié)點(diǎn)。顯然,第一個(gè)沒(méi)有左孩子的節(jié)點(diǎn)是節(jié)點(diǎn)4
  2. 依照中序遍歷的次序,接下來(lái)輸出節(jié)點(diǎn)4的父節(jié)點(diǎn)2
  3. 再輸出節(jié)點(diǎn)2的右孩子節(jié)點(diǎn)5
  4. 以節(jié)點(diǎn)2為根的左子樹(shù)已經(jīng)輸出完畢,這時(shí)再輸出整個(gè)二叉樹(shù)的根節(jié)點(diǎn)1
  5. 由于節(jié)點(diǎn)3沒(méi)有左孩子,所以直接輸出根節(jié)點(diǎn)1的右孩子節(jié)點(diǎn)3
  6. 最后輸出節(jié)點(diǎn)3的右孩子節(jié)點(diǎn)6
    到此為止,所有的節(jié)點(diǎn)都遍歷輸出完畢

2.1.3 后序遍歷

二叉樹(shù)的后序遍歷,輸出順序是左子樹(shù)、右子樹(shù)、根節(jié)點(diǎn)
11. 數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)
步驟如下:

  1. 首先訪問(wèn)根節(jié)點(diǎn)的左孩子,如果這個(gè)左孩子還擁有左孩子,則繼續(xù)深入訪問(wèn)下去,一直找到不再有左孩子 的節(jié)點(diǎn),并輸出該節(jié)點(diǎn)。顯然,第一個(gè)沒(méi)有左孩子的節(jié)點(diǎn)是節(jié)點(diǎn)4
  2. 輸出右節(jié)點(diǎn)5
  3. 輸出節(jié)點(diǎn)4的父節(jié)點(diǎn)2
  4. 以節(jié)點(diǎn)2為根的左子樹(shù)已經(jīng)輸出完畢,這時(shí)再輸出整個(gè)二叉樹(shù)的右子樹(shù)
  5. 訪問(wèn)根節(jié)點(diǎn)的右孩子,如果這個(gè)右孩子擁有左孩子,則繼續(xù)深入訪問(wèn)下去,一直找到不再有左
    孩子 的節(jié)點(diǎn),如果沒(méi)有左孩子則找右孩子,并輸出該節(jié)點(diǎn)6
  6. 輸出節(jié)點(diǎn)6的父節(jié)點(diǎn)3
    到此為止,所有的節(jié)點(diǎn)都遍歷輸出完畢。

2.2 廣度優(yōu)先遍歷

也叫層序遍歷,顧名思義,就是二叉樹(shù)按照從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的層次關(guān)系,一層一層橫向遍歷各個(gè)節(jié)點(diǎn)。
11. 數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)
二叉樹(shù)同一層次的節(jié)點(diǎn)之間是沒(méi)有直接關(guān)聯(lián)的,利用隊(duì)列可以實(shí)現(xiàn)

2.3 遍歷代碼實(shí)現(xiàn)

2.3.1 定義樹(shù)節(jié)點(diǎn)

package org.wanlong.tree;

/**
 * @author wanlong
 * @version 1.0
 * @description: 樹(shù)節(jié)點(diǎn)定義
 * @date 2023/6/1 11:22
 */
public class TreeNode<T> {
    //數(shù)據(jù)
    T data;
    //左孩子
    TreeNode left;
    //右孩子
    TreeNode right;


    public TreeNode(T data) {
        this.data = data;
    }
}

2.3.2 定義樹(shù)節(jié)點(diǎn)維護(hù)方法

package org.wanlong.tree;

/**
 * @author wanlong
 * @version 1.0
 * @description: 二叉樹(shù)
 * @date 2023/6/1 11:24
 */
public class BinaryTree {

    TreeNode root;

    public void insertNode(int data) {
        root = insert(root, data);
    }

    /**
     * @param node: 基準(zhǔn)節(jié)點(diǎn)
     * @param data: 待插入數(shù)據(jù)
     * @return org.wanlong.tree.TreeNode
     * @Description:往一個(gè)節(jié)點(diǎn)下面插入data數(shù)據(jù)
     * @Author: wanlong
     * @Date: 2023/6/1 11:28
     **/
    public TreeNode insert(TreeNode<Integer> node, Integer data) {
        //如果基準(zhǔn)節(jié)點(diǎn)為空,創(chuàng)建新的節(jié)點(diǎn)插入
        if (node == null) {
            return new TreeNode(data);
        }
        //如果待插入數(shù)據(jù)小于當(dāng)前節(jié)點(diǎn),插入左子樹(shù)
        if (data < node.data) {
            //遞歸確定插入左子樹(shù)的位置,插入后,返回左子樹(shù)指針
            node.left = insert(node.left, data);
            //如果待插入節(jié)點(diǎn)大于當(dāng)前節(jié)點(diǎn),插入右子樹(shù)
        } else if (data > node.data) {
            node.right = insert(node.right, data);
        } else {
            node.data = data;
        }
        return node;
    }
}

2.3.3 前序遍歷代碼實(shí)現(xiàn)

/**
 * @param node:
 * @return void
 * @Description: 前序遍歷節(jié)點(diǎn) 先根,再左再右
 * @Author: wanlong
 * @Date: 2023/6/1 11:38
 **/
public void preOrder(TreeNode node) {
    if (node == null) {
        return;
    }
    System.out.println(node.data);
    preOrder(node.left);
    preOrder(node.right);
}

2.3.4 中序遍歷代碼實(shí)現(xiàn)

/**
 * @param node:
 * @return void
 * @Description:中序遍歷 先左 再根 再右
 * @Author: wanlong
 * @Date: 2023/6/1 11:41
 **/
public void middleOrder(TreeNode node) {
    if (node == null) {
        return;
    }
    middleOrder(node.left);
    System.out.println(node.data);
    middleOrder(node.right);
}

2.3.5 后序遍歷代碼實(shí)現(xiàn)

/**
 * @param node:
 * @return void
 * @Description:后序遍歷 先左,再右,再根
 * @Author: wanlong
 * @Date: 2023/6/1 15:21
 **/
public void postOrder(TreeNode node) {
    if (node == null) {
        return;
    }
    postOrder(node.left);
    postOrder(node.right);
    System.out.println(node.data);
}

2.3.6 廣度優(yōu)先遍歷代碼實(shí)現(xiàn)

廣度優(yōu)先遍歷可用節(jié)點(diǎn)入隊(duì)出隊(duì)的方式便捷實(shí)現(xiàn),具體代碼實(shí)現(xiàn)如下

/**
 * @Description: 廣度優(yōu)先遍歷
 * @Author: wanlong
 * @Date: 2023/6/1 15:29
 * @param root:
 * @return void
 **/
public void wideOrder(TreeNode root){
    //廣度優(yōu)先遍歷可用隊(duì)列出隊(duì)入隊(duì)的方式快速實(shí)現(xiàn)
    LinkedList<TreeNode> queue = new LinkedList<>();
    //根節(jié)點(diǎn)入隊(duì)
    queue.offer(root);
    while (!queue.isEmpty()){
        //隊(duì)列頭節(jié)點(diǎn)出隊(duì)
        TreeNode node = queue.poll();
        //打印數(shù)據(jù)
        System.out.println(node.data);
        //左右節(jié)點(diǎn)入隊(duì)
        if (node.left!=null){
            queue.offer(node.left);
        }
        if (node.right!=null){
            queue.offer(node.right);
        }
    }
}

2.3.7 遍歷結(jié)果測(cè)試

package org.wanlong.tree;

import org.junit.BeforeClass;
import org.junit.Test;

/**
 * @author wanlong
 * @version 1.0
 * @description: 測(cè)試樹(shù)的遍歷
 * @date 2023/6/1 15:15
 */
public class Client {

    static BinaryTree btt = new BinaryTree();

    @BeforeClass
    public static void init() {
        btt.insertNode(10);
        btt.insertNode(8);
        btt.insertNode(11);
        btt.insertNode(7);
        btt.insertNode(9);
        btt.insertNode(12);

    }

    @Test
    public void testpre() {
        btt.preOrder(btt.root);
        //10
        //8
        //7
        //9
        //11
        //12
    }

    @Test
    public void testMiddle() {
        btt.middleOrder(btt.root);
        //7
        //8
        //9
        //10
        //11
        //12
    }

    @Test
    public void testpost() {
        btt.postOrder(btt.root);
        //7
        //9
        //8
        //12
        //11
        //10
    }

    @Test
    public void testwide(){
        btt.wideOrder(btt.root);
    }
    //10
    //8
    //11
    //7
    //9
    //12
}

以上,本人菜鳥(niǎo)一枚,如有錯(cuò)誤,請(qǐng)不吝指正。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-468655.html

到了這里,關(guān)于11. 數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

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

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

    在這里先說(shuō)明一下,結(jié)點(diǎn)和節(jié)點(diǎn)其實(shí)一樣的,無(wú)須關(guān)注這個(gè)。 1. 概念:樹(shù)是一種非線性的數(shù)據(jù)結(jié)構(gòu),它是由n個(gè)有限節(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合。 如上圖所示,把此種數(shù)據(jù)結(jié)構(gòu)稱作樹(shù)是因?yàn)樗雌饋?lái)像一個(gè)倒掛的樹(shù)。 ?2. 特點(diǎn) 有一個(gè)特殊的節(jié)點(diǎn),稱為根節(jié)點(diǎn),它是唯一

    2024年02月07日
    瀏覽(18)
  • 數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)的實(shí)現(xiàn)

    數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)的實(shí)現(xiàn)

    目錄 前言 1. 二叉樹(shù)的遍歷 1.1二叉樹(shù)的前、中、后序遍歷 1.2?層序遍歷 2.二叉樹(shù)的實(shí)現(xiàn) 2.1 二叉樹(shù)的結(jié)構(gòu) 2.2構(gòu)建二叉樹(shù) ?2.2 前序遍歷的實(shí)現(xiàn) 2.3 中序遍歷的實(shí)現(xiàn) 2.4 后序遍歷的實(shí)現(xiàn) 2.5 計(jì)算樹(shù)的節(jié)點(diǎn)個(gè)數(shù) 2.6 計(jì)算樹(shù)的深度 2.7 計(jì)算葉子節(jié)點(diǎn)個(gè)數(shù) 2.8 計(jì)算樹(shù)第k層的節(jié)點(diǎn)數(shù) 2.9 以內(nèi)容

    2023年04月10日
    瀏覽(23)
  • 《數(shù)據(jù)結(jié)構(gòu)與算法》之二叉樹(shù)(補(bǔ)充樹(shù))

    《數(shù)據(jù)結(jié)構(gòu)與算法》之二叉樹(shù)(補(bǔ)充樹(shù))

    二叉搜索樹(shù),也稱二叉排序樹(shù)或二叉查找樹(shù) 二叉搜索樹(shù):一棵二叉樹(shù),可以為空,如果不為空,應(yīng)該滿足以下性質(zhì): 非空左子樹(shù)的所有結(jié)點(diǎn)小于其根結(jié)點(diǎn)的鍵值 非空右子樹(shù)的所有結(jié)點(diǎn)大于其根結(jié)點(diǎn)的鍵值 左右子樹(shù)都是二叉搜索樹(shù) 對(duì)于二叉樹(shù)的查找,其實(shí)沿用的是分治法的

    2024年02月08日
    瀏覽(19)
  • 數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)的性質(zhì)與存儲(chǔ)結(jié)構(gòu)

    數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)的性質(zhì)與存儲(chǔ)結(jié)構(gòu)

    ??數(shù)據(jù)結(jié)構(gòu)是程序設(shè)計(jì)的重要基礎(chǔ),它所討論的內(nèi)容和技術(shù)對(duì)從事軟件項(xiàng)目的開(kāi)發(fā)有重要作用。學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)要達(dá)到的目標(biāo)是學(xué)會(huì)從問(wèn)題出發(fā),分析和研究計(jì)算機(jī)加工的數(shù)據(jù)的特性,以便為應(yīng)用所涉及的數(shù)據(jù)選擇適當(dāng)?shù)倪壿嫿Y(jié)構(gòu)、存儲(chǔ)結(jié)構(gòu)及其相應(yīng)的操作方法,為提高利用

    2024年01月21日
    瀏覽(39)
  • 數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)的數(shù)組表示

    若某節(jié)點(diǎn)的索引為 i ,則該節(jié)點(diǎn)的左子節(jié)點(diǎn)的索引為 2i+1 ,右子節(jié)點(diǎn)的索引為 2i+2 給定某節(jié)點(diǎn),獲取它的左右字節(jié)點(diǎn),父節(jié)點(diǎn) 獲取前序遍歷,中序遍歷,后序遍歷,層序遍歷

    2024年01月18日
    瀏覽(27)
  • 數(shù)據(jù)結(jié)構(gòu)奇妙旅程之二叉樹(shù)初階

    數(shù)據(jù)結(jié)構(gòu)奇妙旅程之二叉樹(shù)初階

    ??????? write in front???????? ?????????大家好,我是xiaoxie.希望你看完之后,有不足之處請(qǐng)多多諒解,讓我們一起共同進(jìn)步????? . ?? ?xiaoxie?????????—CSDN博客 本文由xiaoxie??????????原創(chuàng) CSDN?如需轉(zhuǎn)載還請(qǐng)通知???? 個(gè)人主頁(yè):xiaoxie??

    2024年01月19日
    瀏覽(30)
  • 【數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)的構(gòu)建和遍歷】

    【數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)的構(gòu)建和遍歷】

    前言: 前篇學(xué)習(xí)了 數(shù)據(jù)結(jié)構(gòu)之樹(shù)和二叉樹(shù)的基本概念知識(shí),那么這篇繼續(xù)完善二叉樹(shù)的相關(guān)知識(shí)并完成實(shí)現(xiàn)二叉樹(shù)的構(gòu)建和遍歷的內(nèi)容。 / 知識(shí)點(diǎn)匯總 / 因?yàn)榍捌呀?jīng)非常詳細(xì)的單獨(dú)學(xué)習(xí)了數(shù)和二叉樹(shù)的基本知識(shí)概念,那么這里就簡(jiǎn)單回顧一下即可。 概念 : 二叉樹(shù)(Bina

    2024年02月21日
    瀏覽(25)
  • 數(shù)據(jù)結(jié)構(gòu)初階之二叉樹(shù)的詳細(xì)解析

    數(shù)據(jù)結(jié)構(gòu)初階之二叉樹(shù)的詳細(xì)解析

    個(gè)人主頁(yè):點(diǎn)我進(jìn)入主頁(yè) 專欄分類:C語(yǔ)言初階? ? ??C語(yǔ)言程序設(shè)計(jì)————KTV? ? ? ?C語(yǔ)言小游戲? ? ?C語(yǔ)言進(jìn)階 C語(yǔ)言刷題? ? ? ?數(shù)據(jù)結(jié)構(gòu)初階? ??Linux 歡迎大家點(diǎn)贊,評(píng)論,收藏。 一起努力,共赴大廠。 目錄 1.前言? 2.二叉樹(shù)各個(gè)功能代碼實(shí)現(xiàn) 2.1二叉樹(shù)結(jié)構(gòu)體 2.2二叉

    2024年02月05日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)(C語(yǔ)言附詳細(xì)代碼)

    數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)(C語(yǔ)言附詳細(xì)代碼)

    目錄 一,樹(shù)和二叉樹(shù) 1.樹(shù) ①定義 ②關(guān)于樹(shù)的一些概念 2.二叉樹(shù) ①定義 ②特殊的二叉樹(shù) ③二叉樹(shù)的性質(zhì) ④二叉樹(shù)的存儲(chǔ)結(jié)構(gòu)(順序結(jié)構(gòu),只適用于完全二叉樹(shù)) ⑤二叉樹(shù)的遍歷 二,二叉樹(shù)操作代碼 1.頭文件 2.函數(shù)代碼 ①創(chuàng)建二叉樹(shù) ②前序遍歷二叉樹(shù) ③中序遍歷二叉樹(shù) ④后序

    2024年02月01日
    瀏覽(25)
  • 數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹(shù): Leetcode 111. 二叉樹(shù)的最小深度 (Typescript版)

    二叉樹(shù)的最小深度 https://leetcode.cn/problems/minimum-depth-of-binary-tree/ 描述 就 給定一個(gè)二叉樹(shù),找出其最小深度。 最小深度是從根節(jié)點(diǎn)到最近葉子節(jié)點(diǎn)的最短路徑上的節(jié)點(diǎn)數(shù)量。 說(shuō)明:葉子節(jié)點(diǎn)是指沒(méi)有子節(jié)點(diǎn)的節(jié)點(diǎn)。 示例 1 示例 2 提示 樹(shù)中節(jié)點(diǎn)數(shù)的范圍在 [0, 1 0 5 10^5 1 0 5 ] 內(nèi)

    2024年02月06日
    瀏覽(29)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包