最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)LeetCode(106.由中序和后序遍歷建立二叉樹)

 更新時(shí)間:2021年07月22日 14:31:07   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(106.由中序和后序遍歷建立二叉樹),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 106. Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序遍歷建立二叉樹

Given inorder and postorder traversal of a tree, construct the binary tree.

Note:
You may assume that duplicates do not exist in the tree.

For example, given

inorder = [9,3,15,20,7]
postorder = [9,15,7,20,3]

Return the following binary tree:

    3
/ \
9  20
/  \
15   7

這道題要求從中序和后序遍歷的結(jié)果來(lái)重建原二叉樹,我們知道中序的遍歷順序是左-根-右,后序的順序是左-右-根,對(duì)于這種樹的重建一般都是采用遞歸來(lái)做,可參見(jiàn)博主之前的一篇博客 Convert Sorted Array to Binary Search Tree。針對(duì)這道題,由于后序的順序的最后一個(gè)肯定是根,所以原二叉樹的根結(jié)點(diǎn)可以知道,題目中給了一個(gè)很關(guān)鍵的條件就是樹中沒(méi)有相同元素,有了這個(gè)條件就可以在中序遍歷中也定位出根節(jié)點(diǎn)的位置,并以根節(jié)點(diǎn)的位置將中序遍歷拆分為左右兩個(gè)部分,分別對(duì)其遞歸調(diào)用原函數(shù)。代碼如下:

class Solution {
public:
    TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
        return buildTree(inorder, 0, inorder.size() - 1, postorder, 0, postorder.size() - 1);
    }
    TreeNode *buildTree(vector<int> &inorder, int iLeft, int iRight, vector<int> &postorder, int pLeft, int pRight) {
        if (iLeft > iRight || pLeft > pRight) return NULL;
        TreeNode *cur = new TreeNode(postorder[pRight]);
        int i = 0;
        for (i = iLeft; i < inorder.size(); ++i) {
            if (inorder[i] == cur->val) break;
        }
        cur->left = buildTree(inorder, iLeft, i - 1, postorder, pLeft, pLeft + i - iLeft - 1);
        cur->right = buildTree(inorder, i + 1, iRight, postorder, pLeft + i - iLeft, pRight - 1);
        return cur;
    }
};

上述代碼中需要小心的地方就是遞歸是 postorder 的左右 index 很容易寫錯(cuò),比如 pLeft + i - iLeft - 1, 這個(gè)又長(zhǎng)又不好記,首先我們要記住 i - iLeft 是計(jì)算 inorder 中根節(jié)點(diǎn)位置和左邊起始點(diǎn)的距離,然后再加上 postorder 左邊起始點(diǎn)然后再減1。我們可以這樣分析,如果根結(jié)點(diǎn)就是左邊起始點(diǎn)的話,那么拆分的話左邊序列應(yīng)該為空集,此時(shí) i - iLeft 為0, pLeft + 0 - 1 < pLeft, 那么再遞歸調(diào)用時(shí)就會(huì)返回 NULL, 成立。如果根節(jié)點(diǎn)是左邊起始點(diǎn)緊跟的一個(gè),那么 i - iLeft 為1, pLeft + 1 - 1 = pLeft,再遞歸調(diào)用時(shí)還會(huì)生成一個(gè)節(jié)點(diǎn),就是 pLeft 位置上的節(jié)點(diǎn),為原二叉樹的一個(gè)葉節(jié)點(diǎn)。

下面來(lái)看一個(gè)例子, 某一二叉樹的中序和后序遍歷分別為:

Inorder:    11  4  5  13  8  9

Postorder:  11  4  13  9  8  5  

11  4  5  13  8  9      =>          5

11  4  13  9  8  5                /  \

11  4     13   8  9      =>         5

11  4     13  9  8                  /  \

                             4   8

11       13    9        =>         5

11       13    9                    /  \

                             4   8

                            /    /     \

                           11    13    9

Github 同步地址:

https://github.com/grandyang/leetcode/issues/106

類似題目:

Construct Binary Tree from Preorder and Postorder Traversal

Construct Binary Tree from Preorder and Inorder Traversal

參考資料:

https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/

https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/discuss/758462/C%2B%2B-Detail-Explain-or-Diagram

https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/discuss/34803/Sharing-my-straightforward-recursive-solution

到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(106.由中序和后序遍歷建立二叉樹)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)由中序和后序遍歷建立二叉樹內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入學(xué)習(xí)C++智能指針之shared_ptr與右值引用的方法

    深入學(xué)習(xí)C++智能指針之shared_ptr與右值引用的方法

    智能指針的核心實(shí)現(xiàn)技術(shù)是引用計(jì)數(shù),每使用它一次,內(nèi)部引用計(jì)數(shù)加1,每析構(gòu)一次內(nèi)部的引用計(jì)數(shù)減1,減為0時(shí),刪除所指向的堆內(nèi)存,今天通過(guò)本文給大家分享C++智能指針之shared_ptr與右值引用的方法,需要的朋友跟隨小編一起看看吧
    2021-07-07
  • C語(yǔ)言編程之初識(shí)數(shù)組線性查找和二分查找

    C語(yǔ)言編程之初識(shí)數(shù)組線性查找和二分查找

    本篇文章是C語(yǔ)言編程篇,主要為大家介紹C語(yǔ)言編程中數(shù)組的線性查找及二分查找分析講解,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • C++?Boost?Spirit進(jìn)階教程

    C++?Boost?Spirit進(jìn)階教程

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11
  • 如何將C++源程序改寫為C語(yǔ)言

    如何將C++源程序改寫為C語(yǔ)言

    C++中主要的與C的區(qū)別最大而且最常用的特性及修改方法,接下來(lái)我們一起來(lái)學(xué)習(xí)他們吧
    2021-08-08
  • C++關(guān)于引用作為函數(shù)的用法

    C++關(guān)于引用作為函數(shù)的用法

    今天小編就為大家分享一篇關(guān)于C++關(guān)于引用作為函數(shù)的用法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • C++中的模板類繼承和成員訪問(wèn)問(wèn)題

    C++中的模板類繼承和成員訪問(wèn)問(wèn)題

    這篇文章主要介紹了C++中的模板類繼承和成員訪問(wèn)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • c++ 預(yù)處理之正整型實(shí)現(xiàn)方法

    c++ 預(yù)處理之正整型實(shí)現(xiàn)方法

    這篇文章主要介紹了c++ 預(yù)處理之正整型實(shí)現(xiàn)方法,需要的朋友可以參考下
    2017-07-07
  • C++ 中使用lambda代替 unique_ptr 的Deleter的方法

    C++ 中使用lambda代替 unique_ptr 的Deleter的方法

    這篇文章主要介紹了C++ 中使用lambda代替 unique_ptr 的Deleter的方法,需要的朋友可以參考下
    2017-04-04
  • Qt讀寫XML文件的方法詳解(含源碼+注釋)

    Qt讀寫XML文件的方法詳解(含源碼+注釋)

    XML文件可以用來(lái)存儲(chǔ)項(xiàng)目中的數(shù)據(jù),它相當(dāng)于一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù),下面這篇文章主要給大家介紹了關(guān)于Qt讀寫XML文件(含源碼+注釋)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • 學(xué)習(xí)二維動(dòng)態(tài)數(shù)組指針做矩陣運(yùn)算的方法

    學(xué)習(xí)二維動(dòng)態(tài)數(shù)組指針做矩陣運(yùn)算的方法

    這片文章介紹了如何利用二維動(dòng)態(tài)數(shù)組指針做矩陣運(yùn)算,需要的朋友可以參考下
    2015-07-07

最新評(píng)論

都昌县| 平舆县| 任丘市| 铜陵市| 宜都市| 儋州市| 焦作市| 桑日县| 镇安县| 呼图壁县| 渝中区| 桓台县| 澄迈县| 嘉荫县| 阿城市| 浦县| 巢湖市| 曲水县| 涟源市| 锡林浩特市| 门源| 扶绥县| 宕昌县| 米易县| 库车县| 潞城市| 晋江市| 湟中县| 元江| 大同县| 卓资县| 阿拉善右旗| 洪江市| 海南省| 竹北市| 慈溪市| 海安县| 恭城| 曲靖市| 宁津县| 瑞安市|