成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

程序員應(yīng)知應(yīng)會(huì)之一文讀懂二叉樹的四種遍歷

開發(fā) 前端
我們可以看到,對(duì)于人類來講最為簡潔明了的層次算法,對(duì)于計(jì)算機(jī)編程來說,需要的代碼量要大很多。原因在于對(duì)于人們來說直觀的約束條件,如哪個(gè)節(jié)點(diǎn)在哪一層,對(duì)于計(jì)算機(jī)來說并不直觀。

樹是編程中的一種最為重要的數(shù)據(jù)結(jié)構(gòu)了,應(yīng)用范圍很廣。比如說人們常用的操作系統(tǒng),如Windows和Linux,它們的文件管理系統(tǒng)都是樹型結(jié)構(gòu)的。而這其中二叉樹又是應(yīng)用最廣的樹,因此也是很多程序員入門時(shí)學(xué)習(xí)的主要數(shù)據(jù)結(jié)構(gòu)。

從外表上來看,二叉樹非常簡單,每個(gè)節(jié)點(diǎn)延伸出兩個(gè)子節(jié)點(diǎn),一層一層地延續(xù)下去,像人們的祖譜一樣,非常容易理解。

 

圖片


二叉樹相關(guān)的編程中,二叉樹的遍歷是最為常見的一種,對(duì)于普通人來說,如果想遍歷上圖的二叉樹的話,很多人都會(huì)很直白地一層一層讀下去,于是遍歷出來的結(jié)果就是ABCDEFG。非常直觀。

但是計(jì)算機(jī)的計(jì)算方式和人們的思維方式是不一樣的,這種層次遍歷對(duì)于人來說非常好理解,但是對(duì)于計(jì)算機(jī)來說,并不是很好理解。

所以為了更符合計(jì)算機(jī)的思考方式,研究人員提出了先序遍歷、中序遍歷、后序遍歷三種算法。這三種算法都是如何遍歷二叉樹的呢?我們來看一下。

一、先序遍歷

先序遍歷(Pre-order),也叫前序遍歷,按照根左右的順序沿一定路徑經(jīng)過路徑上所有的結(jié)點(diǎn)。在二叉樹中,對(duì)每個(gè)節(jié)點(diǎn)都是,先根后左再右。也就是,根左右。具體實(shí)現(xiàn)方法如下:

public static void preOrder(BinTreeNode t) {
    if (null == t ) return;
    System.out.println(t.getData());
    preOrder(t.getlChild());
    preOrder (t.getrChild());
}

對(duì)于上圖的二叉樹,遍歷結(jié)果為,abdcegf。

二、中序遍歷

中序遍歷,也叫中根遍歷、中序周游。中序遍歷首先遍歷左子樹,然后訪問根結(jié)點(diǎn),最后遍歷右子樹。也就是,左根右。具體實(shí)現(xiàn)方法如下:

public static void inOrder(BinTreeNode t) {
    if (null == t ) return;
    inOrder(t.getlChild());
    System.out.println(t.getData());
    inOrder (t.getrChild());
}

對(duì)于上圖的二叉樹,遍歷結(jié)果為:dbagefc。

三、后序遍歷

后序遍歷(LRD)也叫做后根遍歷、后序周游。后序遍歷首先遍歷左子樹,然后遍歷右子樹,最后訪問要節(jié)點(diǎn)。也就是,左右根。具體實(shí)現(xiàn)方法如下:

public static void postOrder(BinTreeNode t) {
    if (null == t ) return;
    postOrder(t.getlChild());
    postOrder (t.getrChild());
    System.out.println(t.getData());
}

對(duì)于上圖的二叉樹,遍歷結(jié)果為:dbgefca。

可以看到,上面的三種算法中,區(qū)別就是在于打印節(jié)點(diǎn)數(shù)據(jù)(應(yīng)用節(jié)點(diǎn)數(shù)據(jù)域)的代碼位置不一樣而已。對(duì)于計(jì)算機(jī)來說,使用遞歸算法,非常簡潔明了。

四、層次遍歷

那么更符合人們習(xí)慣的層次遍歷,計(jì)算機(jī)又需要怎樣執(zhí)行呢?我們可以看到,對(duì)于計(jì)算機(jī)而言,最大的問題在于它并不知道哪個(gè)節(jié)點(diǎn)屬于哪一層,因此,我們需要使用代碼記錄,每個(gè)層次的節(jié)點(diǎn)信息。通常情況下,我們可以使用隊(duì)列來實(shí)現(xiàn)。代碼如下:

public static void levelOrder(BinTreeNode t) {
    Queue<BinTreeNode> q = new LinkedList<>();
    q.offer(t);
    while (!q.isEmpty()){
        int size = q.size();
        for (int i=0; i<size; i++) {
            BinTreeNode node = q.poll();
            System.out.println(node.getData());
            if (node.getlChild()!= null) q.offer(node.getlChild());
            if (node.getrChild() != null) q.offer(node.getrChild());
        }
    }
}

打印結(jié)果為:abcdefg。

我們可以看到,對(duì)于人類來講最為簡潔明了的層次算法,對(duì)于計(jì)算機(jī)編程來說,需要的代碼量要大很多。原因在于對(duì)于人們來說直觀的約束條件,如哪個(gè)節(jié)點(diǎn)在哪一層,對(duì)于計(jì)算機(jī)來說并不直觀。因此,很多時(shí)候?qū)τ诔绦騿T來說,要按照計(jì)算機(jī)的思維來看問題,這樣寫出的代碼才能更符合計(jì)算機(jī)的習(xí)慣。

責(zé)任編輯:武曉燕 來源: 活在信息時(shí)代
相關(guān)推薦

2020-04-27 07:05:58

二叉樹左子樹右子樹

2022-10-12 23:25:17

二叉樹父節(jié)點(diǎn)根節(jié)點(diǎn)

2021-05-06 17:46:30

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

2023-05-06 07:24:22

程序員視頻算法

2022-10-26 23:58:02

二叉樹數(shù)組算法

2021-04-20 08:37:14

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

2023-05-08 15:57:16

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

2022-11-04 07:12:24

JavaScript基準(zhǔn)測試

2021-09-15 07:56:32

二叉樹層次遍歷

2022-09-04 19:43:05

程序員數(shù)據(jù)庫

2013-06-28 10:17:04

2021-09-15 07:40:50

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

2018-09-29 05:31:14

二叉樹

2021-01-13 10:03:36

二叉樹層序遍歷層次遍歷

2009-08-11 13:29:57

C#二叉樹遍歷

2011-05-31 09:22:39

程序員

2021-04-19 07:47:42

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

2011-05-26 10:04:30

程序員

2022-12-02 07:16:29

MySQL函數(shù)日期

2024-11-05 14:00:56

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品v | 1级毛片 | 亚洲综合在线一区二区 | 四虎成人免费视频 | 精品国产欧美一区二区三区成人 | 国产精品一区二区久久 | 福利久久| 在线播放一区二区三区 | 欧美精品福利视频 | 国产一区二区在线免费播放 | 欧美色图另类 | 亚洲综合在线播放 | 欧美精品网站 | 欧美中文字幕在线观看 | 性网址 | 日韩欧美一区二区在线播放 | 男女羞羞的网站 | 久久久久久九九九九九九 | 免费一区二区三区 | 日日操av | 91成人| 另类 综合 日韩 欧美 亚洲 | 国产在线一区观看 | 日韩激情一区 | 九色av | 国产精品久久久久久一级毛片 | 天堂一区二区三区 | 午夜一区二区三区在线观看 | 成人精品一区二区 | 先锋影音资源网站 | 日韩av成人 | 国产视频中文字幕 | 亚洲人成人一区二区在线观看 | 欧美日韩国产精品一区 | 中文字幕久久久 | 91久久久久久久久久久 | 九九热在线免费视频 | 国产精品国产三级国产aⅴ原创 | 在线免费观看黄视频 | 日韩在线精品视频 | 久久99深爱久久99精品 |