題目描述:
根據一棵樹的中序遍歷與後序遍歷構造二叉樹。
注意:你可以假設樹中沒有重複的元素。
例如,給出
中序遍歷 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...