力扣第105題,從前序和中序構造二叉樹

2021-10-08 05:48:37 字數 1435 閱讀 2601

思路:

引數:前序序列,中序序列,和兩個序列的範圍,表示這個樹所有結點

根據前序,可以知道開始位置就是根結點,然後再中序裡面尋找根結點的位置,記住位置root_pos,

根結點左邊的都是左子樹結點,左子樹結點個數left_num=root_pos - in_start;

treenode *root= new treenode(pre[p_start])

遞迴建立左子樹 前序序列的左子樹範圍就是pre_start+1~pre_start+1+leftnum

中序序列的左子樹範圍就是in_start~root_pos

遞迴建立右子樹,前序序列的右子樹範圍就是pre_start+1+leftnum~pre_end

中序序列的右子樹範圍就是root_pos+1~in_end

在中序序列中查詢根結點時,避免遍歷,可以使用雜湊表

class

solution

return

build

(preorder,

0, preorder.

size()

, inorder,

0, inorder.

size()

,map);}

//pre_start前序的開始,p_end結束,包括左,不包括右

treenode*

build

(vector<

int>

& pre,

int p_start,

int p_end,

vector<

int>

& in,

int i_start,

int i_end,unordered_map<

int,

int>

&map)

int root_val = pre[p_start]

; treenode *root =

newtreenode

(root_val)

;//利用雜湊表在中序中,尋找root_val的值

int root_pos = map[root_val]

;//左子樹的個數

int left_num = root_pos - i_start;

root-

>left =

build

(pre, p_start +

1, p_start + left_num +

1, in, i_start, root_pos,map)

; root-

>right =

build

(pre, p_start + left_num +

1, p_end, in, root_pos+

1, i_end, map)

;return root;}}

;

力扣 105 從前序與中序遍歷序列構造二叉樹

105.從前序與中序遍歷序列構造二叉樹 和這個題目類似的還有 106.從中序與後序遍歷序列構造二叉樹 看到題目以後,就想到上資料結構的時候利用樹的先 後 序遍歷和中序遍歷來搭建樹的方法,但是不知道如何用演算法實現,慚愧!似乎樹這個資料結構和遞迴就很有緣分,從構建一棵樹到遍歷一棵樹,都可以用遍歷來解決...

LeetCode105 前序 中序構造樹

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。前序拿到根節點,在中序中找到該節點左邊的元素和右邊的元素,遞迴下去.public class offer 07 else if index inorderend 1 else return root 看了官方的遞迴解法,思...

105 從前序與中序遍歷序列構造二叉樹

如題,根據前序與中序遍歷序列構造二叉樹 整體思路 前序遍歷的第乙個元素,必然是二叉樹的根節點 在中序遍歷中找到前序遍歷第乙個元素的位置 該位置左邊的所有點都是二叉樹的左子樹元素,該位置右邊的所有點都是二叉樹的右子樹元素 思路一 遞迴 字典 由整體思路可以構建子函式用於遞迴,不斷求子樹的左右子樹,直到...