重建二叉樹 遍歷二叉樹的三種方式

2021-10-24 23:26:32 字數 1148 閱讀 9131

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。

示例

前序遍歷 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...