[geeks]Construct BST from given preorder traversal

思路一:preorder數組的第一個元素爲根,然後從左到右開始找第一個大於根的元素,遞歸的構造左右子樹,時間複雜度O(n)。

思路二:一邊遍歷preorder數組一邊構造BST

struct TreeNode {
	int val;
	TreeNode *left;
	TreeNode *right;
	TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Solution {
public:
	TreeNode *buildTree(vector<int> &preorder) {
		/*O(n^2)*/
		//return buildTree(preorder, 0, preorder.size()-1);
		/*O(n)*/
		int cur = 0;
		return buildTree(preorder, cur, INT_MIN, INT_MAX);
	}
	TreeNode *buildTree(vector<int> &preorder, int begin, int end) {
		if(begin > end) return NULL;
		TreeNode *root = new TreeNode(preorder[begin]);
		if(begin == end) return root;
		int idx = begin+1;
		while(idx <= end && preorder[idx] <= root->val) idx++;
		root->left = buildTree(preorder, begin+1, idx-1);
		root->right = buildTree(preorder, idx, end);
		return root;
	}
	TreeNode *buildTree(vector<int> &preorder, int &cur, int min, int max)
	{
		if(cur >= preorder.size()) return NULL;
		TreeNode *root = NULL;
		if(preorder[cur] >= min && preorder[cur] <= max)
		{
			root = new TreeNode(preorder[cur]);
			cur++;
			root->left = buildTree(preorder, cur, min, root->val);
			root->right = buildTree(preorder, cur, root->val, max);
		}
		return root;
	}
};


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