已知前序遍歷中序遍歷,求二叉樹的後序遍歷

2021-09-29 03:23:26 字數 2396 閱讀 6929

陣列下標01

2345

67前序遍歷74

1653

82中序遍歷14

5678

32在二叉樹的前序遍歷中,第乙個數字總是樹的根節點的值。

在中序遍歷中找到根節點,則根節點左邊的數字就是左子樹節點值,根節點右邊的數字就是右子樹節點值。

使用遞迴的思想去分割左右子樹。

在前序遍歷中,第乙個數字是7,是樹的根節點。

在中序遍歷中找到7,以7為分開點

根節點7的左子樹中序遍歷是1,4,5,6,左子樹前序遍歷是4,1,6,5。(由規律可知,4是7的左子樹節點,1是4的左節點,6,5是4的右子樹組成節點,根據分析,6是4的右子樹節點,5是6的左子樹節點)

根節點7的右子樹中序遍歷是8,3,2, 右子樹前序遍歷是3,8,2。(由規律可知,3是7的右子樹節點,再由中序遍歷知8是3的左節點,2是3的右節點)

因此還原出二叉樹如下圖

* 已知二叉樹的前序遍歷和中序遍歷,求二叉樹的後序遍歷

*/class

binarytree

//後序遍歷二叉樹,這個方法設定為私有,不提供給外部訪問

private

void

postorder

(node localroot)

}//提供給外部訪問的後序遍歷介面,但是外部無法得知具體的資料

public

void

postorder()

//外部介面

public

void

inittree

(int

preorder,

int[

] inorder)

/** * 內部介面,初始化二叉樹

* start與end代表的是陣列的起始下標與終點下標

*/private node inittree

(int

preorder,

int start1,

int end1,

int[

] inorder,

int start2,

int end2)

int rootdata=preorder[start1]

;//先序遍歷的第乙個數一定是二叉樹的根節點

node head=

newnode

(rootdata)

;int rootindex=

findrootindexinarray

(inorder,rootdata,start2,end2)

;/**

* leftnodenum,根節點的左子樹數目

* 聯絡上面的findrootindexinarray方法中的start2

* 在中序遍歷中,根節點下標減去中序遍歷陣列其實下標,所得的就是根節點的左節點數目

*/int leftnodenum=rootindex-start2;

//難點,想清楚左右子樹在前序遍歷和後序遍歷中的起始序列

head.left=

inittree

(preorder,start1+

1,start1+leftnodenum,inorder,start2,start2+leftnodenum-1)

; head.right=

inittree

(preorder,start1+leftnodenum+

1,end1,inorder,rootindex+

1,end2)

;return head;

}//尋找根節點在中序遍歷的位置,也就是返回根節點在中序遍歷陣列的下標位置。(下標從0開始)

private

intfindrootindexinarray

(int

inorder,

int rootdata,

int begin,

int end)

}return-1

;//如果根節點不存在,返回-1}}

class

node

public

node

(int data)

}

已知前序遍歷和中序遍歷求二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請輸出後序遍歷序列。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,重建二叉樹並返回後序遍歷序列 輸入某二叉樹的前序遍歷和中序遍歷的結果 輸出後序遍歷序列 1 2 4 7 3 5 6 8 4 7 2 1 5 3 8 6...

已知二叉樹的前序遍歷,中序遍歷,求後序遍歷的問題。

首先先說下二叉樹的結構吧,對於如下圖1所示的結構,a為根節點,b為左子樹,c 為右子樹。圖1 現在開始切入正題,先解釋下二叉樹的前序遍歷,中序遍歷,和後序遍歷吧。1.前序遍歷 先遍歷根結點,然後遍歷左子樹,最後遍歷右子樹。2.中序遍歷 先遍歷左子樹,然後遍歷根結點,最後遍歷右子樹。3.後序遍歷 先遍...

已知二叉樹先序遍歷中序遍歷求後序遍歷

思路簡介 先序遍歷中第乙個字母即為根節點,在中序遍歷中找到根節點的位置 把中序遍歷的字串序列從根節點分成兩部分,左側一部分構建左子樹,右側一部分構建右子樹 在 的基礎上在先序遍歷中也找到構建左右子樹的部分 遞迴還原二叉樹 後序遍歷輸出即可 include include using namespac...