摘要:第一行為前序遍歷,第二行為中序遍歷。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹并返回。根據(jù)前序遍歷和中序遍歷的結(jié)果可以拿到左子中序遍歷和右側(cè)為右子樹中序遍歷左子樹的前序遍歷和右子樹的前序遍歷然后遞歸左子樹和右子樹的完成重建。
二叉樹簡介
基本結(jié)構(gòu):
function TreeNode(x) { this.val = x; this.left = null; this.right = null; }
二叉樹的前序、中序、后序遍歷的定義:
前序遍歷:對任一子樹,先訪問跟,然后遍歷其左子樹,最后遍歷其右子樹;
中序遍歷:對任一子樹,先遍歷其左子樹,然后訪問根,最后遍歷其右子樹;
后序遍歷:對任一子樹,先遍歷其左子樹,然后遍歷其右子樹,最后訪問根。
題目1 二叉樹遍歷 1.1 題目描述給定一棵二叉樹的前序遍歷和中序遍歷,求其后序遍歷
輸入描述:
兩個字符串,其長度n均小于等于26。
第一行為前序遍歷,第二行為中序遍歷。
二叉樹中的結(jié)點名稱以大寫字母表示:A,B,C....最多26個結(jié)點。
輸出描述:
輸入樣例可能有多組,對于每組測試樣例,
輸出一行,為后序遍歷的字符串。
樣例:
輸入 ABC BAC FDXEAG XDEFAG 輸出 BCA XEDGAF1.2 解題思路
前序遍歷:跟節(jié)點 + 左子樹前序遍歷 + 右子樹前序遍歷
中序遍歷:左子樹中序遍歷 + 跟節(jié)點 + 右字?jǐn)?shù)中序遍歷
后序遍歷:左子樹后序遍歷 + 右子樹后序遍歷 + 跟節(jié)點
1.前序遍歷的頭部為跟節(jié)點
2.中序遍歷以跟節(jié)點分割,左側(cè)為左子中序遍歷,右側(cè)為右子樹中序遍歷
3.根據(jù)中序遍歷得到的左子樹右子樹的長度,得到左子樹的前序遍歷和右子樹的前序遍歷
1.3 代碼let pre; let vin; while((pre = readline())!=null){ vin = readline(); print(getHRD(pre,vin)); } function getHRD(pre, vin) { if (!pre) { return ""; } if (pre.length === 1) { return pre; } const head = pre[0]; const splitIndex = vin.indexOf(head); const vinLeft = vin.substring(0, splitIndex); const vinRight = vin.substring(splitIndex + 1); const preLeft = pre.substring(1, splitIndex + 1); const preRight = pre.substring(splitIndex + 1); return getHRD(preLeft, vinLeft) + getHRD(preRight, vinRight) + head;題目2 二叉樹重建 2.1 題目描述
輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請重建出該二叉樹。假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中都不含重復(fù)的數(shù)字。
例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹并返回。
2.2 解題思路思路和題目1相似。
根據(jù)前序遍歷和中序遍歷的結(jié)果可以拿到:
左子中序遍歷和右側(cè)為右子樹中序遍歷
左子樹的前序遍歷和右子樹的前序遍歷
然后遞歸左子樹和右子樹的完成重建。
2.3 代碼function reConstructBinaryTree(pre, vin) { if(pre.length === 0){ return null; } if(pre.length === 1){ return new TreeNode(pre[0]); } const value = pre[0]; const index = vin.indexOf(value); const vinLeft = vin.slice(0,index); const vinRight = vin.slice(index+1); const preLeft = pre.slice(1,index+1); const preRight = pre.slice(index+1); const node = new TreeNode(value); node.left = reConstructBinaryTree(preLeft, vinLeft); node.right = reConstructBinaryTree(preRight, vinRight); return node; }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/100966.html
摘要:例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹并返回。操作給定的二叉樹,將其變換為源二叉樹的鏡像。劍指中還有一道類似的變種題目,就是下面的這道,之字形遍歷二叉樹。最后下面的兩道題目分別運用了二叉樹先序中序遍歷算法。 開篇 以下內(nèi)容可能偏應(yīng)試但很好理解,所以大家一定要堅持看下去,因為我們變強的過程注定孤獨的,堅持下來就會看到明天的太陽。 回顧 showImg(https://user-...
摘要:例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹并返回。代表前序數(shù)組,代表中序數(shù)組。中序遍歷的左右子樹比較好找,但是前序遍歷的左右子樹想到比較難找。 jdk 版本: jdk 1.8 題目:輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請重建出該二叉樹。假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中都不含重復(fù)的數(shù)字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,...
摘要:例如,輸入前序遍歷序列和中序遍歷序列,則重建二叉樹并返回。題解對二叉樹前序中序遍歷的考察,采用遞歸的方法解決問題,難點是確定每一個子樹的臨界點。 題目 輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請重建該二叉樹。假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果都不含重復(fù)的數(shù)字。例如,輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹并返回。 ...
摘要:題目輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請重建該二叉樹。例如,給出前序遍歷中序遍歷返回如下的二叉樹限制節(jié)點個數(shù)答案要使用這個方法,首先要將一個原始的數(shù)組,從下標(biāo)開始復(fù)制,復(fù)制到上標(biāo)不包括,生成一個新的數(shù)組。 題目輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請重建該二叉樹。假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中都不...
摘要:實現(xiàn)基本數(shù)據(jù)結(jié)構(gòu)棧,隊列,鏈表這篇筆記側(cè)重點二叉樹的三種遍歷前中后迭代非迭代代碼重建二叉樹的代碼與分析和關(guān)于二叉樹的題簡單理解二叉查找樹紅黑樹,的性質(zhì),實際用途。同時,以對應(yīng)的節(jié)點為邊界,就會把中序遍歷的結(jié)果分為左子樹和右子樹。 雖是讀書筆記,但是如轉(zhuǎn)載請注明出處 http://segmentfault.com/blog/exploring/ .. 拒絕伸手復(fù)制黨 以下是算法導(dǎo)論第十...
閱讀 2185·2021-09-02 15:11
閱讀 1506·2019-08-30 15:43
閱讀 2073·2019-08-29 13:48
閱讀 2790·2019-08-26 13:55
閱讀 2100·2019-08-23 15:09
閱讀 2896·2019-08-23 14:40
閱讀 3420·2019-08-23 14:23
閱讀 2631·2019-08-23 14:20