陣列下標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...