某公司的一道面試題,跪了,希望能學到東西!解決的問題是將雙向鍊錶有序輸出,直接上**,不懂的可以在下面提問,有問題希望高手能提出來,或者能進行優化的,感覺在輸出的**上寫的不好,希望大牛幫忙看下。
/*問題:將乙個雙向鍊錶有序的輸出,平均時間
複雜度為nlogn,不能退化為n方,輔助空間大小為
o(1)
從上面的問題看來,只能使用堆排序對雙向鍊錶進行排序
輸出,才能滿足所有要有,所以我們
將雙向鍊錶轉化為完全二叉樹
然後進行堆排序
1,2,3,4,5,6
將雙向鍊錶的向前向後指標轉化為
左指標和右指標
思路: 1
/ \
2 3
/ \ /
4 5 6
*/#include #include using namespace std;
//雙向鍊錶的資料結構,這裡使用就不使用模板了,直接使用int
typedef struct doublelinklist * pdoublelinklist;
//功能:建立雙向鍊錶
//輸入:整形容器array
//輸出:雙向鍊錶的頭指標
//注:單元測試函式,時間複雜度不計入總時間複雜度
pdoublelinklist createdoublelinklist(vector&array)
return head;
}//解決:將雙向鍊錶轉化為二叉樹
//輸入:雙向鍊錶的頭指標doublelinklist *head
//輸出:二叉樹的根結點指標,雖然這個結點依然是用雙向鍊錶的資料結構
//時間複雜度:n;
pdoublelinklist doublelinklisttobinarytree(pdoublelinklist head)else
curnode = nextnode;
if (nextnode != null)
nextnode = nextnode->next;
} return head;
}//功能:對二叉樹進行堆排序(小頂堆)
//輸入:無序二叉樹的根結點
//輸出:二叉堆的根結點
//時間複雜度:nlogn
void heapsort(pdoublelinklist root)
}else if (root->value > root->next->value)
}else if (root->pre != null) }}
//功能:返回二叉堆的最後乙個結點
//輸入:二叉堆的根結點,二叉堆的大小
//輸出:二叉堆的最後乙個結點指標
//時間複雜度:log(n)
pdoublelinklist getendnode(pdoublelinklist *root, size_t length)
if (length == 2)
if (length == 3)
int i = 2;
while(i++)
if (pow(2, i) > length)
break;
int ipow = length - pow(2, i-1);
if (ipow >= pow(2, i-2))
return getendnode(&(*root)->next, ipow);
else
return getendnode(&(*root)->pre, ipow + 2);
}//功能:將二叉堆有序輸出
//輸入:二叉堆的根結點pdobluelinklist root
//輸出:列印有序陣列
void printfheap(pdoublelinklist root, size_t length)
}int main(int argc, char **argv)
pdoublelinklist head = createdoublelinklist(vec);
pdoublelinklist root = doublelinklisttobinarytree(head);
printfheap(root, vec.size());
return 0;
}
將二叉搜尋樹轉化為雙向鍊錶
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。建立的雙向鍊錶的順序就是二叉搜尋樹的中序遍歷結果。這裡有遞迴和非遞迴解法。一般的非遞迴解法需要開闢額外的空間,本次借助morris演算法,給出一種不需要額外空間開銷的非遞迴解法。首先是遞...
將乙個二叉搜尋樹轉化為有序雙向鍊錶
題目 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。解題思路 根據二叉搜尋樹的特點,左子樹的結點 根節點 右子樹的結點,我們可以按照二叉樹中序遍歷的順序對該二叉樹的指標進行調整,使得二叉樹變為乙個有序的雙向鍊錶。採用遞迴的思路,先對...
二叉搜尋樹轉化為雙向鍊錶
首先需要明白二叉搜尋樹也是一種排序的資料結構,它的中序遍歷就是乙個不遞減的順序排列 所以如果要轉換成乙個排序好的雙向鍊錶,那麼僅需要改變原來指向左子節點和右子節點的指標,讓他們分別指向前節點和後節點即可,如圖所示 調整指標 原先指向左子節點的指標調整為鍊錶中指向前乙個節點的指標 原先指向右子節點的指...