通過先序和中序陣列生成後序陣列
給出一棵二叉樹的先序和中序陣列,通過這兩個陣列直接生成正確的後序陣列。
輸入描述:
第一行乙個整數 n,表示二叉樹的大小。
第二行 n 個整數 a_i,表示二叉樹的先序遍歷陣列。
第三行 n 個整數 b_i,表示二叉樹的中序遍歷陣列。
輸出描述:
輸出一行 n 個整數表示二叉樹的後序遍歷陣列。
示例1輸入
3
1 2 3
2 1 3
輸出2 3 1
備註:
1 ≤n
≤104
1 \leq n \leq 10^4
1≤n≤1041≤
ai,b
i≤
n1 \leq a_i,b_i \leq n
1≤ai,
bi≤
n 題解:先序遍歷:根 左 右
中序遍歷:左 根 右
先序遍歷的第乙個節點一定是整棵樹的根節點,於是我們可以在中序遍歷中查詢該節點位置,假設為 p ,則在中序遍歷序列中:p左邊的序列就是根節點左子樹中序遍歷序列,p右邊的序列就是根節點右子樹中序遍歷序列,遞迴進行處理左右子樹即可。(注意:提前儲存先序序列中的每個元素在中序序列中的位置,可優化速度)
**:
#include
#include
using
namespace std;
const
int n =
10010
;int n;
int pre[n]
;int in[n]
;unordered_map<
int,
int> hash;
void
dfs(
int p_l,
int p_r,
int i_l,
int i_r)
intmain
(void
)dfs(0
, n -1,
0, n -1)
;return0;
}
通過先序和中序陣列生成後序陣列
題目 已知一棵二叉樹所有的節點值都不同,給定這棵樹正確的先序和中序陣列,不要重建整棵樹,而是通過這兩個陣列直接生成正確的後序陣列。基本思路 根據當前的先序和中序陣列,設定後序陣列最右邊的值,然後劃分出左子樹的先序 中序陣列,以及右子樹的先序 中序陣列,先根據右子樹的劃分設定好後序陣列,再根據左子樹的...
先序 中序和後序陣列兩兩結合重構二叉樹
題目 已知一棵二叉樹的所有節點值都不同,給定這棵二叉樹正確的先序 中序和後序陣列。請分別用三個函式實現任意兩種陣列結合重構原來的二叉樹,並返回重構二叉樹的頭結點。public class preinposttobst public static node preintotree int pre,in...
已知先序和中序求後序或中序和後序求先序
首先介紹樹的三種遍歷方式的遍歷順序 先序遍歷 根 左子樹 右子樹 特點 第乙個元素為根 中序遍歷 左子樹 根 右子樹 特點 根的兩邊分別為左子樹和右子樹 後序遍歷 左子樹 右子樹 根 特點 最後乙個元素為根 有如下圖的二叉樹 其先序 中序 後序遍歷分別為 dbacegf abcdefg acbfge...