乙個二叉樹的遍歷序列不能決定一棵二叉樹,但某些不同的遍歷序列組合可以唯一確定一棵二叉樹。
給定一棵二叉樹的前序遍歷序列和中序遍歷序列可以唯一確定一棵二叉樹的結構,給定一棵二叉樹的後序遍歷序列和中序遍歷序列也可以唯一確定一棵二叉樹的結構。
注意:這還有乙個條件:二叉樹的任意兩個結點的值都不相同。
一. 根據前序遍歷序列和中序遍歷序列重建二叉樹
參考:劍指 offer 07. 重建二叉樹
原理:分治
前序遍歷性質: 節點按照[ 根節點 | 左子樹 | 右子樹 ]
排序。
中序遍歷性質: 節點按照[ 左子樹 | 根節點 | 右子樹 ]
排序。
根據以上性質,可得出以下推論:
1. 前序遍歷的 首元素 為樹的根節點 node 的值。
2. 在中序遍歷中搜尋根節點 node 的索引 ,可將 中序遍歷 劃分為[ 左子樹 | 根節點 | 右子樹 ]
。
3. 根據中序遍歷中的左 / 右子樹的節點數量,可將 前序遍歷 劃分為[ 根節點 | 左子樹 | 右子樹 ]
。
(確定左子樹和右子樹在中序陣列和前序陣列中的左右邊界位置)
按照上述步驟可以分出二叉樹的左右子樹,而對於子樹的左右子樹,也可同上進行劃分。
由此考慮通過遞迴對所有子樹進行劃分,從而重建二叉樹。
/*** definition for a binary tree node.
* public class treenode
* } */
class
solution
treenode recur(
int ps, int pe, int is, int
ie)
}
ps: 使用雜湊表map
儲存中序遍歷的值與索引的對映,查詢操作的時間複雜度為 o(1)
時間複雜度o(n),空間複雜度o(n)
二、根據後序遍歷序列和中序遍歷序列重建二叉樹
原理:分治
後序遍歷性質: 節點按照[ 左子樹 | 右子樹 | 根節點 ]
排序。
中序遍歷性質: 節點按照[ 左子樹 | 根節點 | 右子樹 ]
排序。
根據以上性質,可得出以下推論:
1. 後序遍歷的 尾元素 為樹的根節點 node 的值。
2. 在中序遍歷中搜尋根節點 node 的索引 ,可將 中序遍歷 劃分為[ 左子樹 | 根節點 | 右子樹 ]
。
3. 根據中序遍歷中的左 / 右子樹的節點數量,可將 後序遍歷 劃分為[ 左子樹 | 右子樹 | 根節點 ]
。
(確定左子樹和右子樹在中序陣列和後序陣列中的左右邊界位置)
類似 前中遍歷重建二叉樹 **如下:
/*** definition for a binary tree node.
* public class treenode
* } */
class
solution
treenode recur(
int ps, int pe, int is, int
ie)
}
二叉樹前中後遍歷
最近做題的時候經常碰見二叉樹的題,這次來個完整的遍歷順序,一勞永逸遍歷的方法有 層序遍歷 先序遍歷 中序遍歷 後序遍歷等,以下面的二叉樹為例介紹遍歷 e b f a d h c g i k j1.層序遍歷 即從上到下按層次訪問該樹,每一層單獨輸出一行,每一層要求訪問的順序為從左到右。例子中層序遍歷為...
重建二叉樹 前序遍歷和中序遍歷
主要程式設計思想 由於前序遍歷第乙個數永遠是根,中序遍歷根左邊是左子樹,右邊衛右子樹。因此,每次找到乙個根節點,前序遍歷就可以分成左子樹序列和右子樹序列,中序遍歷也可以分成左子樹序列和右子樹序列,分別建立左子樹和右子樹,所以是非常典型的遞迴問題 treenode rebuildtree vector...
二叉樹 前中後 非遞迴遍歷
非遞迴遍歷就是迭代遍歷 模擬的就是遞迴中的過程,比遞迴略微複雜 非遞迴前序遍歷 public static void prordernor treenode root 獲取棧頂元素 curnode st.pop 訪問棧頂元素的右子樹 curnode curnode.right system.out....