二叉樹系列——根據前序和中序、中序和後序構建二叉樹
1、根據前序和中序構建二叉樹
思路:在二叉樹的前序遍歷序列中,第一個數字總是樹的根節點的值。但在中序遍歷序列中,根節點的值在序列的中間,左子樹的節點的值位於根節點的值得左邊,而右子樹的節點的值位於根節點的值的左邊。所以需要掃描中序遍歷,才能找到根節點的值。
既然已經分別找到了左、右子樹的前序序列和中序遍歷,我們可以用同樣的方法去構建左右子樹。也就是說,接下來的事情可以用遞迴的方法去完成。
首先是二叉樹結構的定義:
//二叉樹定義 struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode*m_pRight; BinaryTreeNode(int x) : m_nValue(x), m_pLeft(NULL), m_pRight(NULL){}//建構函式 };
程式碼如下:
2、根據中序和後序構建二叉樹//根據前序和中序構建二叉樹 BinaryTreeNode*buildTreeAccordingPreAndIn(int preorder[],int preLength, int inorder[],int inLength) { return buildTreeAccordingPreAndIn(preorder, inorder, 0, preLength - 1, 0, inLength - 1); } //根據前序和中序構建二叉樹,核心函式 BinaryTreeNode*buildTreeAccordingPreAndIn(int preorder[], int inorder[], int startPre, int endPre, int startIn, int endIn){ if (startPre > endPre) return NULL; int nRootVal = preorder[startPre]; BinaryTreeNode*pRoot = new BinaryTreeNode(nRootVal); int i, cnt = 0; for (i = startIn; i <= endIn&&inorder[i] != nRootVal; i++, cnt++); pRoot->m_pLeft = buildTreeAccordingPreAndIn(preorder, inorder, startPre + 1, startPre + cnt, startIn, i - 1); pRoot->m_pRight = buildTreeAccordingPreAndIn(preorder, inorder, startPre + cnt + 1, endPre, i + 1, endIn); return pRoot; }
思路和前面的差不多,程式碼如下:
//根據後序和中序構建二叉樹 BinaryTreeNode *buildTree(int inorder[],int inLength, int postorder[],int postLength) { return buildTree(inorder, postorder, 0, inLength - 1, 0, postLength - 1); } //根據後序和中序構建二叉樹,核心函式 BinaryTreeNode*buildTree(int inorder[], int postorder[], int nStartIn, int nEndIn, int nStartPost, int nEndPost){ if (nStartIn > nEndIn) return NULL; int nRootVal = postorder[nEndPost]; BinaryTreeNode*pRoot = new BinaryTreeNode(nRootVal); int i, cnt = 0; for (i = nStartIn; i <= nEndIn&&inorder[i] != nRootVal; i++, cnt++); pRoot->m_pLeft = buildTree(inorder, postorder, nStartIn, i - 1, nStartPost, nStartPost + cnt - 1); pRoot->m_pRight = buildTree(inorder, postorder, i + 1, nEndIn, nStartPost + cnt, nEndPost - 1); return pRoot; }
相關推薦
二叉樹系列——根據前序和中序、中序和後序構建二叉樹
1、根據前序和中序構建二叉樹 思路:在二叉樹的前序遍歷序列中,第一個數字總是樹的根節點的值。但在中序遍歷序列中,根節點的值在序列的中間,左子樹的節點的值位於根節點的值得左邊,而右子樹的節點的值位於根節
重建二叉樹(根據前序和中序遍歷結果)
public TreeNode reConstructBinaryTree(int [] pre,int [] in) { return build(pre,0,pre.length-1,in,0,in.length-1); } public TreeNode build(in
已知二叉樹的前序遍歷和中序遍歷,如何得到它的後序遍歷?
對一棵二叉樹進行遍歷,我們可以採取3中順序進行遍歷,分別是前序遍歷、中序遍歷和後序遍歷。這三種方式是以訪問父節點的順序來進行命名的。假設父節點是N,左節點是L,右節點是R,那麼對應的訪問遍歷順序如下: 前序遍歷 N->L->R中序遍歷 L->
計算機技術——已知二叉樹的前序遍歷和中序遍歷,如何得到它的後序遍歷?
對一棵二叉樹進行遍歷,我們可以採取3中順序進行遍歷,分別是前序遍歷、中序遍歷和後序遍歷。這三種方式是以訪問父節點的順序來進行命名的。假設父節點是N,左節點是L,右節點是R,那麼對應的訪問遍歷順序如下:前序遍歷 N->L->R中序遍歷 L->N-&
BankCardUtils 根據銀行卡號 獲取 銀行卡型別、銀行名稱和銀行編碼 自動格式化銀行卡號、手機號、身份證號輸入的工具類
BankCardUtils 專案地址:nanchen2251/BankCardUtils 簡介:根據銀行卡號 獲取 銀行卡型別、銀行名稱和銀行編碼 自動格式化銀行卡號、手機號、身份證號輸入的工具類 更多:作者 提 Bug  
十二、python學習之python高階二(property、魔法方法和魔法屬性、多繼承和多重繼承、閉包和裝飾器)
一、property: 1.get/set方法: 1.1 隱藏實現細節:在使用物件時,儘量不要讓使用者直接操作物件中的屬性,這樣會帶來安全隱患。改進辦法,使用私有屬性。 1.2 提供精確的訪問控制:學習過 set/get方法,是專門來為類的私有屬性提供訪問介面。 1.
SQL筆記二:過濾條件欄位多個取值、模糊匹配和兩個值之間取值、去重
上一節簡單的總結了單表查詢和多表查詢,以下給大家總結了查詢語句的結構,如下: SELECT...FROM...WHERE...GROUP BY...HAVING...ORDER BY...LIMIT... 本節主要總結下常用的條件欄位的匹配問題,最常見的是“=”,如select * from studen
十六週任務二 學生成績排序檔案score.dat 中儲存的是100 名學生的姓名和C++課、高數和英語成績,將成績排序後儲存到ordered_score.dat檔案中
/* (程式頭部註釋開始) * 程式的版權和版本宣告部分 * Copyright (c) 2011, 煙臺大學計算機學院學生 * All rights reserved. * 檔名稱: 十六週任務二 學生成績排序檔案score.dat 中儲存的是100 名學生的姓名
根據WebService地址展示方法列表、入參和返回值(解析wsdl)
主要使用XPATH來解析wsdl文件,dom4j解析xsd 建議先了解一下WSDL的一些元素所代表的含義 效果(返回值暫時沒做,邏輯是一樣的): 獲取Document方法: /** * 得到wsdl檔案的根結點的document * *
jquery中append、prepend, before和after方法的區別(二)
1.append()與after() 這兩個都是在元素的後面插入內容,不同的是前者是在元素內部插入(作為該元素的子元素),後者是在元素外部插入(作為該元素的兄弟元素);但是這裡我要講的是,當用表單驗證中用到這兩個方法時的區別:append()比較正常;而after()則會沒
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第6章節--在SharePoint2013中開發、集成和構建應用程序 總結
epo pos pop mod data 基礎上 註入 代碼 enter BEGINNING SHAREPOINT? 2013 DEVELOPMENT 第6章節--在SharePoint2013中開發、集成和構建應用程序 總結 SharePoint開發
【Linux相識相知】計算機的組成、linux發行版和哲學思想、基礎命令和目錄結構
知識 sun pro 復制 val 算術 uil cdr type 從今天開始,Frank將開始在博客上記錄自己學習linux的點點滴滴,F初來乍到,還望各位大佬多多指教。本次博客的主要內容如下: 計算機基礎:簡要的描述了計算機的組成及其功能; linux初
jQuery的DOM操作之設置和獲取HTML、文本和值 html()text()val()
java fontsize doc .text cti checkbox .net mar jsb 1. html()方法: 此方法類似於JavaScript中的innerHTML屬性,可以用來讀取或者設置某個元素中的html內容。 <html> <h
jquery中append、prepend, before和after方法的區別(一)
mod serve com oos 兄弟節點 sha pos 插入 5% 原文:http://blog.csdn.net/woosido123/article/details/64439490 在 jquery中append() 與 prepend()是在元素內插
第六課 相對和絕對路徑、創建和刪除目錄及cd和rm命令的使用
20180326一、相對路徑和絕對路徑 pwd命令: 打印查看當前路徑 絕對目錄就是以/(根)開頭的,相對路徑就是相對當前目錄,不是以/(根)開頭的。 二、cd命令cd 進入到一個目錄cd - 進入上次的目錄(相當於遙控器上的相互交替的按鍵)cd ~ 回到用戶家目錄cd .. 進入到上一級目錄 三、創
第十七節:易混淆的概念(靜態和非靜態、拆箱和裝箱)
博客 學生 margin tex OS 地址 add logs text 一. 靜態和非靜態 二. 拆箱和裝箱 1 ! 作 者 :
以太坊生態系統中工具、類庫和開發技術
如果你是以太坊區塊鏈的新手,那麼你可能會不知所措(至少我是),並試圖瞭解以太坊生態系統中的所有工具和技術。因此,我決定在開始學習以太坊時簡要描述下你經常遇到的各種元件。希望這將有助於你全面瞭解以太坊生態系統以及所有部分如何組合在一起。 1.以太坊 以太坊是一個智慧合約區塊鏈,你可以在
MyBatis中resultType、resultMap元素和分步關聯查詢
MyBatis select標籤, 常用元素有:id、parameterType、resultType、resultMap, id:配合Mapper的全限定名,聯合成為一個唯一的標識,使用者標識這條SQL。 parameterType:表示這條SQL接受的引數型別,可以是MyBatis系統定
python中json檔案處理涉及的四個函式json.dumps()和json.loads()、json.dump()和json.load()的區分
一、概念理解 1、json.dumps()和json.loads()是json格式處理函式(可以這麼理解,json是字串) (1)json.dumps()函式是將一個Python資料型別列表進行json格式的編碼(可以這麼理解,json.dumps()函式是將字典轉化為字串) (
ASP.NET MVC中Section、Partial View 和 Child Action(轉載)
概括的講,View中的內容可以分為靜態和動態兩部分。靜態內容一般是html元素,而動態內容指的是在應用程式執行的時候動態建立的內容。給View新增動態內容的方式可歸納為下面幾種: Inline code,小的程式碼片段,如 if 和 foreach 語句。 Html helper方法,用來生成單個