題幹:輸入某二叉樹的前序遍歷和中虛遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中虛遍歷的結果中都不含重複的數字。例如,輸入前序遍歷序列和中虛遍歷序列,則重建出如下圖所示的二叉樹並輸出它的頭結點。
解題思路:
我們知道二叉樹的前序遍歷序列中,第乙個數字總是樹的根結點的值。但在中序遍歷序列中,根結點的值在序列的中間,左子樹的結點的值位於根結點的值的左邊,而右子樹結點的值位於根結點的值的右邊。因此我們可以掃瞄中序遍歷 序列找到根結點的值。
前序遍歷序列的第乙個數字1就是根結點的值,在掃瞄中序遍歷序列,就能確定根結點的值的位置。根據中序遍歷特點,在根結點的值1前面的3個數字都是左子樹結點的值,位於1後面的數字都是右子樹結點的值。
既然我們都已經分別找到了左右子樹的前序遍歷序列和中序遍歷序列,我門可以用同樣的辦法分別去構建左右子樹。也就是說接下來的事情可以用遞迴的方法去完成。
實現**:
#include #include struct binarytreenode ;
struct binarytreenode * constructcore (int * startpreorder,int *endpreorder,int * startinorder,int * endinorder) else
}int * rootinorder = startinorder;
while (rootinorder<= endinorder && *rootinorder != rootvalue)
if (rootinorder == endpreorder && * rootinorder != rootvalue)
long int leftlength = rootinorder - startinorder;
int * leftpreorderend = startpreorder + leftlength;
if (leftlength > 0)
if (leftlength < endpreorder - startpreorder)
return root;
}struct binarytreenode * construct(int * preorder,int * inorder,int length)
return constructcore(preorder, preorder + length - 1, inorder, inorder + length - 1);
}int main(int argc, const char * argv) ;
int b[8] = ;
construct(a,b,8);
return 0;
}
class treenode:
def __init__(self, x):
self.val = x
self.left = none
self.right = none
class solution:
def __init__(self):
self.dic = {}
self.po =
# 做好遞迴前的基本條件
def buildtree(self, preorder: list, inorder: list) -> treenode:
self.dic = {}
self.po = preorder
for i in range(len(inorder)):
self.dic[inorder[i]] = i
return self.recur(0, 0, len(inorder) - 1)
# pre_root是先序遍歷的下標 in_left是中序遍歷下標 in_right是後序遍歷索引
def recur(self, pre_root, in_left, in_right):
if in_left > in_right:
return # 終止條件:中序遍歷為空
root = treenode(self.po[pre_root]) # 建立當前子樹的根節點
i = self.dic[self.po[pre_root]] # 搜尋根節點在中序遍歷中的索引,從而可對根節點、左子樹、右子樹完成劃分。
root.left = self.recur(pre_root + 1, in_left, i - 1) # 開啟左子樹的下層遞迴
root.right = self.recur(i - in_left + pre_root + 1, i + 1, in_right) # 開啟右子樹的下層遞迴
return root # 返回根節點,作為上層遞迴的左(右)子節點
preorder = [3, 9, 20, 15, 7]
inorder = [9, 3, 15, 20, 7]
solu = solution()
tree = solu.buildtree(preorder, inorder)
print(tree)
二叉樹 重建二叉樹
問題 給定二叉樹的前序遍歷結果和中序遍歷結果,恢復出原二叉樹。假設二叉樹中的元素都不重複,給定二叉樹的前序遍歷序列,二叉樹的中序遍歷序列。看到此題,我首先想到的是尋找根節點,由前序遍歷序列可以看出根節點為1,此時通過中序遍歷可以看出來4,7,2在根節點的左子樹,5,3,8,6在樹的右節點。此時我們可...
二叉樹 重建二叉樹
題目給定兩個陣列,乙個是前序遍歷陣列 preorder 乙個是中序遍歷陣列 inorder 要求輸出還原二叉樹 核心在於我們要理解前序和中序便利的特點 前序遍歷 根節點 左節點 右節點 中序遍歷 左節點 根節點 右節點 所以我們從二叉樹的根節點開始重構 也就是preorder的第乙個值 同時用乙個m...
二叉樹重建
摘自劉汝佳的 演算法競賽入門經典 preorder t t 的根結點 preorder t 的左子樹 preorder t 的右子樹 inorder t inorder t 的左子樹 t 的根結點 inorder t 的右子樹 postorder t postorder t 的左子樹 postord...