思路:
引數:前序序列,中序序列,和兩個序列的範圍,表示這個樹所有結點
根據前序,可以知道開始位置就是根結點,然後再中序裡面尋找根結點的位置,記住位置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 從前序與中序遍歷序列構造二叉樹
如題,根據前序與中序遍歷序列構造二叉樹 整體思路 前序遍歷的第乙個元素,必然是二叉樹的根節點 在中序遍歷中找到前序遍歷第乙個元素的位置 該位置左邊的所有點都是二叉樹的左子樹元素,該位置右邊的所有點都是二叉樹的右子樹元素 思路一 遞迴 字典 由整體思路可以構建子函式用於遞迴,不斷求子樹的左右子樹,直到...