LeetCode106 從中序和後序序列構造二叉樹

2022-06-27 20:18:15 字數 2121 閱讀 2101

題目描述:

根據一棵樹的中序遍歷與後序遍歷構造二叉樹。

注意:你可以假設樹中沒有重複的元素。

例如,給出

中序遍歷 inorder = [9,3,15,20,7]

後序遍歷 postorder = [9,15,7,20,3]

返回如下的二叉樹:

3

/ \9 20

/ \

15 7

/*

* * definition for a binary tree node.

* struct treenode

* }; */

/*演算法思想:

由於後序的順序的最後乙個肯定是根,所以原二叉樹的根節點可以知道,題目中給了乙個很關鍵的條件就是樹中沒有相同元素,有了這個條件我們就可以在中序遍歷中也定位出根節點的位置,並以根節點的位置將中序遍歷拆分為左右兩個部分,分別對其遞迴呼叫原函式。

需要小心的地方就是遞迴時postorder的左右index很容易寫錯,比如 pleft + i - ileft - 1, 這個又長又不好記,首先我們要記住 i - ileft 是計算inorder中根節點位置和左邊起始點的距離,然後再加上postorder左邊起始點然後再減1。我們可以這樣分析,如果根節點就是左邊起始點的話,那麼拆分的話左邊序列應該為空集,此時i - ileft 為0, pleft + 0 - 1 < pleft, 那麼再遞迴呼叫時就會返回null, 成立。如果根節點是左邊起始點緊跟的乙個,那麼i - ileft 為1, pleft + 1 - 1 = pleft,再遞迴呼叫時還會生成乙個節點,就是pleft位置上的節點,為原二叉樹的乙個葉節點。

*///

演算法實現:

class

solution

treenode *buildtree(vector &inorder, int ileft, int iright, vector &postorder, int pleft, int

pright)

cur->left = buildtree(inorder, ileft, i - 1, postorder, pleft, pleft + i - ileft - 1

); cur->right = buildtree(inorder, i + 1, iright, postorder, pleft + i - ileft, pright - 1

);

return

cur;

}};/*

演算法思想:

與中序遍歷和前序遍歷構造二叉樹的過程類似。只不過對於後序遍歷來說,根節點是最後乙個被訪問的節點。

*///

演算法實現:

class

solution

if(postorder.size()!=inorder.size())

vector

inorder_l,inorder_r,postorder_l,postorder_r; ///

/輔助空間,存放被分割開的中序和後序遍歷的序列

int root_index=-1,len =postorder.size();

treenode* root=new treenode(postorder[len-1]); //

根節點即後序尾結點

for(int i=0;i//

在中序佇列中找出根節點位置

if(postorder[len-1]==inorder[i])

}for(int i=0; i//

左右子樹的後序、中序序列

postorder_l.push_back(postorder[i]);

inorder_l.push_back(inorder[i]);

}for(int i=root_index+1; i)

root->left=buildtree(inorder_l, postorder_l); //

遞迴重建左子樹

root->right=buildtree(inorder_r, postorder_r); //

遞迴重建右子樹

return

root;

}};

106 從中序與後序遍歷序列構造二叉樹

根據一棵樹的中序遍歷與後序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 中序遍歷 inorder 9,3,15,20,7 後序遍歷 postorder 9,15,7,20,3 返回如下的二叉樹 3 9 20 15 7 class solution def buildtree sel...

106 從中序與後序遍歷序列構造二叉樹

思路 和105題一樣,這次根節點在後續遍歷的最後,找到它 之後在中序遍歷裡找到根節點。arrays.copyofrange 函式找出中序陣列和後續陣列的左右子樹序列,遞迴,構成樹,返回根節點。不細說了。感覺挺簡單。definition for a binary tree node.public cl...

106 從中序與後序遍歷序列構造二叉樹

根據一棵樹的中序遍歷與後序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 中序遍歷 inorder 9,3,15,20,7 後序遍歷 postorder 9,15,7,20,3 返回如下的二叉樹 3 9 20 15 7 definition for a binary tree nod...