摘要:重建二叉樹輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請(qǐng)重建出該二叉樹。所以先通過前序遍歷找出根節(jié)點(diǎn),然后將中序遍歷分為左右子樹兩組,最后對(duì)于每個(gè)子樹依次遞歸調(diào)用。
重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請(qǐng)重建出該二叉樹。假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中都不含重復(fù)的數(shù)字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹并返回。
思路:二叉樹前序遍歷第一個(gè)點(diǎn)為根節(jié)點(diǎn),中序遍歷順序?yàn)橄茸笞訕淙缓蟾?jié)點(diǎn)最后右子樹。所以先通過前序遍歷找出根節(jié)點(diǎn),然后將中序遍歷分為左右子樹兩組,最后對(duì)于每個(gè)子樹依次遞歸調(diào)用。
function TreeNode(x) { ????this.val = x; ????this.left = null; ????this.right = null; } //pre為前序遍歷序列數(shù)組 vin為中序遍歷序列數(shù)組 function reConstructBinaryTree(pre, vin){ if(pre.length == 0 || vin.length == 0) { return null; } let root = new TreeNode(pre[0]); //根節(jié)點(diǎn)在中序遍歷中的位置 let index = vin.indexOf(pre[0]); let leftPre = pre.slice(1,index+1);//前序左子樹 let rightPre = pre.slice(index+1);//前序右子屬 let leftVin = vin.slice(0,index);//中序左子樹 let rightVin = vin.slice(index+1);//中序右子樹 //開始遞歸 root.left = reConstructBinaryTree(leftPre,leftVin); root.right = reConstructBinaryTree(rightPre,rightVin); return root; } console.log(reConstructBinaryTree([1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6]));
二叉樹的下一個(gè)節(jié)點(diǎn)
給定一個(gè)二叉樹和其中的一個(gè)結(jié)點(diǎn),請(qǐng)找出中序遍歷順序的下一個(gè)結(jié)點(diǎn)并且返回。注意,樹中的結(jié)點(diǎn)不僅包含左右子結(jié)點(diǎn),同時(shí)包含指向父結(jié)點(diǎn)的指針。
思路:根據(jù)中序遍歷的特點(diǎn),要找到一個(gè)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)無(wú)非就是三種情況:1、有右子樹,這時(shí)只需要把其右孩子作為下一個(gè)遍歷的(并不是要找的)節(jié)點(diǎn),然后沿著該節(jié)點(diǎn)的左子樹(如果有的話)出發(fā),直到遇到葉子節(jié)點(diǎn),那么該葉子節(jié)點(diǎn)就是其下一個(gè)要找的節(jié)點(diǎn);2、沒有右子樹,則判斷該節(jié)點(diǎn)是否是其父節(jié)點(diǎn)的左孩子,如果是則其下一個(gè)要找的節(jié)點(diǎn)是其父節(jié)點(diǎn);3、如果不是其父節(jié)點(diǎn)的左孩子,則把其父節(jié)點(diǎn)作為下一個(gè)遍歷的節(jié)點(diǎn),向上回溯,直到找到父節(jié)點(diǎn)沒有父節(jié)點(diǎn)并且父節(jié)點(diǎn)是父節(jié)點(diǎn)的父節(jié)點(diǎn)的左孩子為止。綜合這三種情況就可以找到二叉樹中任意一個(gè)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)。
function TreeNode(x) { ????this.val = x; ????this.left = null; ????this.right = null; this.parent = null; } function getNext(node) { let curNode = null; //第一、判斷是否有右孩子 if(node.right != null) { curNode = node.right; while(curNode.left !=null) { curNode = curNode.left; } return curNode; } //第二、判斷是否是其父節(jié)點(diǎn)的左孩子 if(node.parent == null) { return null; } if(node.parent.left == node) { return node.parent; } //第三、向上找其父節(jié)點(diǎn),直到父節(jié)點(diǎn)是其父節(jié)點(diǎn)的父節(jié)點(diǎn)的左孩子 curNode = node.parent; while(curNode.parent != null) { if(curNode == curNode.parent.left) { return curNode.parent; } curNode = curNode.parent; } return null; } //構(gòu)建二叉樹 let parentNode = createTree( ["a","b","d","e","h","i","c","f","g"], ["d","b","h","e","i","a","f","c","g"]); let i = parentNode.left.right.right;//i節(jié)點(diǎn) let b = parentNode.left;//b節(jié)點(diǎn) let f = parentNode.right.left;//f節(jié)點(diǎn) console.log(getNext(i).val);//a console.log(getNext(b).val);//h console.log(getNext(f).val);//c //根據(jù)前序遍歷和中序遍歷構(gòu)建一顆二叉樹 function createTree(pre,vin){ function TreeNode(x) { ????this.val = x; ????this.left = null; ????this.right = null; this.parent = null; } //pre為前序遍歷序列數(shù)組 vin為中序遍歷序列數(shù)組 function reConstructBinaryTree(pre, vin,parent){ if(pre.length == 0 || vin.length == 0) { return null; } let root = new TreeNode(pre[0]); //根節(jié)點(diǎn)在中序遍歷中的位置 let index = vin.indexOf(pre[0]); let leftPre = pre.slice(1,index+1);//前序左子樹 let rightPre = pre.slice(index+1);//前序右子屬 let leftVin = vin.slice(0,index);//中序左子樹 let rightVin = vin.slice(index+1);//中序右子樹 //開始遞歸 root.parent = parent; root.left = reConstructBinaryTree(leftPre,leftVin,root); root.right = reConstructBinaryTree(rightPre,rightVin,root); return root; } return reConstructBinaryTree(pre,vin,null); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/107472.html
摘要:因此,根據(jù)題目給出的先序遍歷和中序遍歷,可以畫出二叉樹選參考數(shù)據(jù)結(jié)構(gòu)與算法描述實(shí)現(xiàn)二叉樹算法淺談數(shù)據(jù)結(jié)構(gòu)二叉樹慕課網(wǎng)實(shí)現(xiàn)二叉樹算法前端樹控件騰訊軟件開發(fā)面試題 內(nèi)容銜接上一章 數(shù)據(jù)結(jié)構(gòu)與算法:常見排序算法 內(nèi)容提要 什么是樹 - 為什么使用樹 二叉樹 二叉查找樹 紅黑樹 B、B+樹 堆 伸展樹 樹 可以點(diǎn)擊鏈接感受下筆者用d3.js畫的tree https://codepen...
摘要:后剪枝先創(chuàng)建完整的決策樹,然后再嘗試消除多余的節(jié)點(diǎn),也就是采用減枝的方法。 起步 決策樹(decision tree)是一個(gè)樹結(jié)構(gòu),可以是二叉樹或非二叉樹,也可以把他看作是 if-else 規(guī)則的集合,也可以認(rèn)為是在特征空間上的條件概率分布。 決策樹的結(jié)構(gòu) 以一個(gè)簡(jiǎn)單的用于是否買電腦預(yù)測(cè)的決策樹為例子: showImg(https://segmentfault.com/img/remo...
摘要:有網(wǎng)友私信我,期待我的下一篇數(shù)據(jù)結(jié)構(gòu)。前言數(shù)據(jù)結(jié)構(gòu)與算法專題會(huì)不定時(shí)更新,歡迎各位讀者監(jiān)督。本文介紹數(shù)據(jù)結(jié)構(gòu)里一些復(fù)雜的數(shù)據(jù)結(jié)構(gòu)樹,相應(yīng)的會(huì)補(bǔ)充一些算法。除根節(jié)點(diǎn)外,每個(gè)節(jié)點(diǎn)又可以分為多個(gè)不相交的子樹。 聲明:碼字不易,轉(zhuǎn)載請(qǐng)注明出處,歡迎文章下方討論交流。有網(wǎng)友私信我,期待我的下一篇數(shù)據(jù)結(jié)構(gòu)。非常榮幸文章被認(rèn)可,也非常感謝你們的監(jiān)督。 前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會(huì)不定時(shí)更新,歡...
閱讀 3517·2023-04-26 02:48
閱讀 1491·2021-10-11 10:57
閱讀 2517·2021-09-23 11:35
閱讀 1229·2021-09-06 15:02
閱讀 3327·2019-08-30 15:54
閱讀 1650·2019-08-30 15:44
閱讀 907·2019-08-30 15:44
閱讀 1013·2019-08-30 12:52