已知後序與中序輸出前序(先序)

2021-09-26 01:52:02 字數 1071 閱讀 5050

有一顆如下圖的二叉樹

已知後序與中序輸出前序(先序):

後序:3, 4, 2, 6, 5, 1(左右根)

中序:3, 2, 4, 1, 6, 5(左根右)

分析:因為後序的最後乙個總是根結點,令 i 在中序中找到該根結點,則i把中序分為兩部分,左邊是左子樹,右邊是右子樹。因為是輸出先序(根左右),所以先列印出當前根結點,然後列印左子樹,再列印右子樹。左子樹在後序中的根結點為root – (end – i + 1),即為當前根結點-右子樹的個數。左子樹在中序中的起始點start為start,末尾end點為i – 1.右子樹的根結點為當前根結點的前乙個結點root – 1,右子樹的起始點start為i+1,末尾end點為end。

中序根節點的位置

利用中序右子樹+根節點的長度

用後序根節點的位置減去這段長度,可以求得後序左子樹根節點的位置

後序右子樹根節點的位置

輸出的前序應該為:1, 2, 3, 4, 5, 6(根左右)

##include 

using namespace std;

int post=

;int in=

;void

pre(

int root,

int start,

int end)

intmain()

參考:

已知後序與中序輸出前序(先序)

已知前序(先序)與中序輸出後序

已知前序 先序 與中序輸出後序 前序 1,2,3,4,5,6 根左右 中序 3,2,4,1,6,5 左根右 分析 因為前序 根左右 最先出現的總是根結點,所以令root為前序中當前的根結點下標 並且同時把一棵樹分為左子樹和右子樹 start為當前需要列印的子樹在中序中的最左邊的下標,end為當前需要...

已知前序(先序)與中序輸出後序

已知前序 先序 與中序輸出後序 前序 1,2,3,4,5,6 根左右 中序 3,2,4,1,6,5 左根右 分析 因為前序 根左右 最先出現的總是根結點,所以令root為前序中當前的根結點下標 並且同時把一棵樹分為左子樹和右子樹 start為當前需要列印的子樹在中序中的最左邊的下標,end為當前需要...

已知前序(先序)與中序輸出後序

已知前序 先序 與中序輸出後序 前序 1,2,3,4,5,6 根左右 中序 3,2,4,1,6,5 左根右 分析 因為前序 根左右 最先出現的總是根結點,所以令root為前序中當前的根結點下標 並且同時把一棵樹分為左子樹和右子樹 start為當前需要列印的子樹在中序中的最左邊的下標,end為當前需要...