輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。
示例:
前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:
3
/ \9 20
/ \
15 7
限制:
0 <= 節點個數 <= 5000
這個題的解法是根據先序遍歷和中序遍歷的規律,在先序遍歷的序列中,因為第乙個節點一定是根節點cur_root
,所以在中序遍歷中尋找這個根節點的位置pos
,然後以pos
為中點,把中序遍歷的序列分為兩部分:左子樹[ino_start:pos-1]
、右子樹[pos+1:ino_end]
(相當於把一棵樹的根砍掉,分成了兩棵樹),然後根據pos在原來先序遍歷的系列中,也把先序遍歷的序列分為兩部分:左子樹[start+1:pos]
、右子樹[pos:end]
。由此把乙個大問題分成了兩個子問題,分別在左子樹和右子樹重複該操作。
struct treenode*
buildtree
(int
* preorder,
int preordersize,
int* inorder,
int inordersize)
pre_num++;}
node->val =
*preorder;
node->left =
buildtree
(preorder+
1,pre_num,inorder,pre_num)
; node->right =
buildtree
(preorder+pos+
1,preordersize-pre_num-
1,inorder+pos+
1,preordersize-pre_num-1)
;return node;
}
二叉樹三種遍歷方式
三種遍歷方式是按照根節點的訪問順序來定義的 1 前序遍歷 先訪問根結點 然後遍歷左子樹,最後遍歷右子樹 並且,在遍歷左 右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。根左右 2 中序遍歷 先遍歷左子樹 然後訪問根結點,最後遍歷右子樹 並且,在遍歷左 右子樹時,仍然先遍歷左子樹,然後訪問...
二叉樹 重建二叉樹
問題 給定二叉樹的前序遍歷結果和中序遍歷結果,恢復出原二叉樹。假設二叉樹中的元素都不重複,給定二叉樹的前序遍歷序列,二叉樹的中序遍歷序列。看到此題,我首先想到的是尋找根節點,由前序遍歷序列可以看出根節點為1,此時通過中序遍歷可以看出來4,7,2在根節點的左子樹,5,3,8,6在樹的右節點。此時我們可...
二叉樹 重建二叉樹
題目給定兩個陣列,乙個是前序遍歷陣列 preorder 乙個是中序遍歷陣列 inorder 要求輸出還原二叉樹 核心在於我們要理解前序和中序便利的特點 前序遍歷 根節點 左節點 右節點 中序遍歷 左節點 根節點 右節點 所以我們從二叉樹的根節點開始重構 也就是preorder的第乙個值 同時用乙個m...