leetcode 105. 從前序與中序遍歷序列構造二叉樹 c++實現

算法思路:

前序:根左右

中序:左根右

根據前序和中序的特點可以得知,在前序遍歷中尋找根節點,在中序遍歷中將左右子樹分開。依次遞歸下去就可以構造一個二叉樹

以其中一次爲例:

若前序中的根節點位置在中序的長度爲len那麼遞歸如下

node->left = buildTreeCore(preorder, pre_start + 1, pre_start + len, inorder, in_start, in_start + len - 1);
node->right = buildTreeCore(preorder, pre_start + len+1, pre_end, inorder, in_start+ len+1, in_end);

注意處理兩種特殊情況:

1.start==end

TreeNode* node = new TreeNode(preorder[pre_start]);
node->left = NULL;
node->right = NULL;
if (pre_start == pre_end)
	return node;

2.start>end

if (pre_start > pre_end)
	return NULL;

leetcode通過代碼:

TreeNode* buildTreeCore(vector<int>& preorder,int pre_start,int pre_end, vector<int>& inorder,int in_start, int in_end)
	{
		if (pre_start > pre_end)
			return NULL;
		TreeNode* node = new TreeNode(preorder[pre_start]);
		node->left = NULL;
		node->right = NULL;
		if (pre_start == pre_end)
			return node;

		/*在中序中找到根的位置*/
		int len = -1;
		for (int i = in_start; i <= in_end; i++)
		{
			len++;
			if (inorder[i] == preorder[pre_start])
				break;
		}
		/*在中序中找到根的位置*/
		node->left = buildTreeCore(preorder, pre_start + 1, pre_start + len, inorder, in_start, in_start + len - 1);
		node->right = buildTreeCore(preorder, pre_start + len+1, pre_end, inorder, in_start+ len+1, in_end);
		return node;
	}

	TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
		TreeNode*root = NULL;
		if (preorder.size() != inorder.size() || preorder.size() == 0 || inorder.size() == 0)
			return root;
		root= buildTreeCore(preorder, 0, preorder.size()-1, inorder, 0, inorder.size() - 1);
		return root;
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章