將雙向鍊錶轉化為二叉堆並有序輸出

2021-06-30 16:53:59 字數 2146 閱讀 6908

某公司的一道面試題,跪了,希望能學到東西!解決的問題是將雙向鍊錶有序輸出,直接上**,不懂的可以在下面提問,有問題希望高手能提出來,或者能進行優化的,感覺在輸出的**上寫的不好,希望大牛幫忙看下。

/*問題:將乙個雙向鍊錶有序的輸出,平均時間

複雜度為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演算法,給出一種不需要額外空間開銷的非遞迴解法。首先是遞...

將乙個二叉搜尋樹轉化為有序雙向鍊錶

題目 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。解題思路 根據二叉搜尋樹的特點,左子樹的結點 根節點 右子樹的結點,我們可以按照二叉樹中序遍歷的順序對該二叉樹的指標進行調整,使得二叉樹變為乙個有序的雙向鍊錶。採用遞迴的思路,先對...

二叉搜尋樹轉化為雙向鍊錶

首先需要明白二叉搜尋樹也是一種排序的資料結構,它的中序遍歷就是乙個不遞減的順序排列 所以如果要轉換成乙個排序好的雙向鍊錶,那麼僅需要改變原來指向左子節點和右子節點的指標,讓他們分別指向前節點和後節點即可,如圖所示 調整指標 原先指向左子節點的指標調整為鍊錶中指向前乙個節點的指標 原先指向右子節點的指...