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

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

 更新時(shí)間:2021年07月22日 14:31:07   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(106.由中序和后序遍歷建立二叉樹),本篇文章通過簡要的案例,講解了該項(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é)果來重建原二叉樹,我們知道中序的遍歷順序是左-根-右,后序的順序是左-右-根,對于這種樹的重建一般都是采用遞歸來做,可參見博主之前的一篇博客 Convert Sorted Array to Binary Search Tree。針對這道題,由于后序的順序的最后一個(gè)肯定是根,所以原二叉樹的根結(jié)點(diǎn)可以知道,題目中給了一個(gè)很關(guān)鍵的條件就是樹中沒有相同元素,有了這個(gè)條件就可以在中序遍歷中也定位出根節(jié)點(diǎn)的位置,并以根節(jié)點(diǎn)的位置將中序遍歷拆分為左右兩個(gè)部分,分別對其遞歸調(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è)又長又不好記,首先我們要記住 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í)就會返回 NULL, 成立。如果根節(jié)點(diǎn)是左邊起始點(diǎn)緊跟的一個(gè),那么 i - iLeft 為1, pLeft + 1 - 1 = pLeft,再遞歸調(diào)用時(shí)還會生成一個(gè)節(jié)點(diǎn),就是 pLeft 位置上的節(jié)點(diǎn),為原二叉樹的一個(gè)葉節(jié)點(diǎn)。

下面來看一個(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)容請搜索腳本之家以前的文章或繼續(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)存,今天通過本文給大家分享C++智能指針之shared_ptr與右值引用的方法,需要的朋友跟隨小編一起看看吧
    2021-07-07
  • C語言編程之初識數(shù)組線性查找和二分查找

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

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

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

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

    如何將C++源程序改寫為C語言

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

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

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

    C++中的模板類繼承和成員訪問問題

    這篇文章主要介紹了C++中的模板類繼承和成員訪問問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(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文件可以用來存儲項(xiàng)目中的數(shù)據(jù),它相當(dāng)于一個(gè)簡單的數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于Qt讀寫XML文件(含源碼+注釋)的相關(guān)資料,文中通過實(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

最新評論

台前县| 长汀县| 栾川县| 湄潭县| 吴川市| 封丘县| 厦门市| 砀山县| 辽阳县| 邢台市| 华坪县| 永平县| 通江县| 金溪县| 莲花县| 台州市| 德清县| 本溪市| 广平县| 瓮安县| 宾阳县| 沁源县| 东兴市| 胶南市| 巴彦县| 雷山县| 乾安县| 江安县| 扎兰屯市| 昌平区| 久治县| 郁南县| 临西县| 织金县| 原平市| 即墨市| 海口市| 日喀则市| 凌源市| 浏阳市| 嵩明县|