voidsort(vector<int>& nums, int left, int right){
if (right <= left) return; // 終止條件
int mid = left + (right-left)/2;
sort(nums, left, mid); // 左子樹
sort(nums, mid+1, right); // 右子樹
merge(nums, left, mid, right); // 做什麼事(post-order)
}
voidmerge(vector<int>& nums, int left, int mid, int right){
vector<int> vec;
int i = left, j = mid+1;
while (i <= mid && j <= right){
int x = nums[i] < nums[j] ? nums[i++] : nums[j++];
vec.push_back(x);
}
while (i <= mid) vec.push_back(nums[i++]);
while (j <= right) vec.push_back(nums[j++]);
for (int i = left; i <= right; i++)
nums[i] = vec[i-left];
}
換言之,以上就是一個遍歷全部節點的函式,所以本質上數組、鏈表、二叉樹都是在做同樣的事。
數組
voidtraverse(vector<int> nums, int i){
if (i == nums.size()) return;
// pre-order
traverse(nums, i+1);
// post-order
}