1. 程式人生 > >二叉樹系列——根據前序和中序、中序和後序構建二叉樹

二叉樹系列——根據前序和中序、中序和後序構建二叉樹

1、根據前序和中序構建二叉樹

思路:在二叉樹的前序遍歷序列中,第一個數字總是樹的根節點的值。但在中序遍歷序列中,根節點的值在序列的中間,左子樹的節點的值位於根節點的值得左邊,而右子樹的節點的值位於根節點的值的左邊。所以需要掃描中序遍歷,才能找到根節點的值。

既然已經分別找到了左、右子樹的前序序列和中序遍歷,我們可以用同樣的方法去構建左右子樹。也就是說,接下來的事情可以用遞迴的方法去完成。

首先是二叉樹結構的定義:

//二叉樹定義
struct BinaryTreeNode
{
	int m_nValue;
	BinaryTreeNode* m_pLeft;
	BinaryTreeNode*m_pRight;
	BinaryTreeNode(int x) : m_nValue(x), m_pLeft(NULL), m_pRight(NULL){}//建構函式
};

程式碼如下:

//根據前序和中序構建二叉樹
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;
}
2、根據中序和後序構建二叉樹

思路和前面的差不多,程式碼如下:

//根據後序和中序構建二叉樹
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 * *

jqueryappendprepend, beforeafter方法的區別(

1.append()與after() 這兩個都是在元素的後面插入內容,不同的是前者是在元素內部插入(作為該元素的子元素),後者是在元素外部插入(作為該元素的兄弟元素);但是這裡我要講的是,當用表單驗證中用到這兩個方法時的區別:append()比較正常;而after()則會沒

BEGINNING SHAREPOINT&#174; 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

jqueryappendprepend, beforeafter方法的區別(一)

mod serve com oos 兄弟節點 sha pos 插入 5% 原文:http://blog.csdn.net/woosido123/article/details/64439490 在 jquery中append() 與 prepend()是在元素內插

第六課 相對絕對路徑創建刪除目錄及cdrm命令的使用

20180326一、相對路徑和絕對路徑 pwd命令: 打印查看當前路徑 絕對目錄就是以/(根)開頭的,相對路徑就是相對當前目錄,不是以/(根)開頭的。 二、cd命令cd 進入到一個目錄cd - 進入上次的目錄(相當於遙控器上的相互交替的按鍵)cd ~ 回到用戶家目錄cd .. 進入到上一級目錄 三、創

第十七節:易混淆的概念(靜態非靜態拆箱裝箱)

博客 學生 margin tex OS 地址 add logs text 一. 靜態和非靜態 二. 拆箱和裝箱 1 ! 作 者 :

以太坊生態系統工具類庫開發技術

如果你是以太坊區塊鏈的新手,那麼你可能會不知所措(至少我是),並試圖瞭解以太坊生態系統中的所有工具和技術。因此,我決定在開始學習以太坊時簡要描述下你經常遇到的各種元件。希望這將有助於你全面瞭解以太坊生態系統以及所有部分如何組合在一起。 1.以太坊 以太坊是一個智慧合約區塊鏈,你可以在

MyBatisresultTyperesultMap元素分步關聯查詢

MyBatis select標籤, 常用元素有:id、parameterType、resultType、resultMap, id:配合Mapper的全限定名,聯合成為一個唯一的標識,使用者標識這條SQL。 parameterType:表示這條SQL接受的引數型別,可以是MyBatis系統定

pythonjson檔案處理涉及的四個函式json.dumps()json.loads()json.dump()json.load()的區分

一、概念理解 1、json.dumps()和json.loads()是json格式處理函式(可以這麼理解,json是字串)   (1)json.dumps()函式是將一個Python資料型別列表進行json格式的編碼(可以這麼理解,json.dumps()函式是將字典轉化為字串)   (

ASP.NET MVCSectionPartial View Child Action(轉載)

概括的講,View中的內容可以分為靜態和動態兩部分。靜態內容一般是html元素,而動態內容指的是在應用程式執行的時候動態建立的內容。給View新增動態內容的方式可歸納為下面幾種: Inline code,小的程式碼片段,如 if 和 foreach 語句。 Html helper方法,用來生成單個