唯一的難點就是確定當前節點的左子樹的根節點和右子樹的根節點分別在前序遍歷陣列的位置。例如
先序遍歷陣列pre:1 2 3 4 5 6 7
中序遍歷陣列in: 3 2 4 1 6 5 7
1是當前根節點,它在pre中的位置
pre_start =0
接著在in中找到1的位置,即分割點
j =3
當前樹根所囊括的in陣列範圍是
in_start = 0;
in_end = in.length-1;
將in按j分割後,3 2 4就是其左子樹部分,6 5 7就是其右子樹部分。那麼左子樹和右子樹的根節點是哪個呢?根節點是由先序遍歷陣列確定的。
在pre陣列中,注意到,左子樹的根節點就是當前根節點的下乙個,即
root_left =pre_start + 1
而右子樹的根節點需要在當前根節點pre_start的基礎上向前移動j-in_start+1個位置,到達右子樹的部分,這部分的第乙個元素就是右子樹的根節點了:
root_right = pre_start + j - in_start + 1
所以,**如下:
public
class
solution
private treenode construct(int pre, int in,
int pre_start,
int in_start, int in_end)
}
由前序遍歷和中序遍歷重建二叉樹
程式設計之美3.9 給出前序遍歷和中序遍歷,重新建立二叉樹,後序遍歷輸出。如下 view code 1 include 2 include 3 4using namespace std 56 struct node7 1213 void aftertra node proot 1419 aftert...
二叉樹 由前序遍歷和中序遍歷重建二叉樹
由前序遍歷和中序遍歷重建二叉樹 前序序列 1 2 3 4 5 6 中序序列 3 2 4 1 6 5 思路 前序遍歷第乙個是根節點。中序遍歷根節點左側為左子樹,根右側為右子樹。那麼先構造根節點,根節點左側都為左子樹,根右側都為右子樹。然後對左右子樹遞迴式的構造即可。封裝 binarytreenode ...
前序遍歷和中序遍歷重建二叉樹
根據先序序列和中序序列的特點我們可以知道 1 先序的第乙個節點是根節點 2 在中序序列中,根結點前邊的結點都是左子樹中的,根結點右邊的結點都是右子樹中的 3 通過左右子樹的中序序列帶入前序序列可以求出左右子樹的前序序列 4 左右子樹的前序序列第乙個元素分別是根節點的左右孩子 5 可以遞迴上述步驟來重...