clrs 9.1-1 :
演算法思想:
1.將陣列中的元素分組,每組兩個元素,然後比較每組中的兩個元素得到最小值,重新得到包含原來一半元素的陣列,繼續重複上述過程,那麼最後乙個元素必然為最小值。如圖所示,陣列為
2.上述過程形成的是乙個二叉樹,其中葉子節點都為陣列元素,非葉子節點剛好4個,這是二叉樹的性質。
3.然後我們來找第二小元素,第二小元素必然跟著1,首先賦值為5,然後再賦值為3, 然後賦值為2,即為所求。
ps:本章討論的元素都互異,不存在相同值(見原書)
#include
<
iostream
>
using
namespace
std;
class
node
;class
binarytree
;int
main();//
葉子節點
node
**node
=new
node*[
10];
for(
inti =0
; i
<
10; i++)
node[i]
=new
node(arr[i]);
binarytree
*bi_tree
=new
binarytree();
bi_tree
->
create_tree(node,
10);
cout
<<
bi_tree
->
root
->
data
<<
endl;
cout
<<
bi_tree
->
search_second_small()
<<
endl;
return 0;
}node::node()
node::node(
intd)
void
binarytree::create_tree(node
**node,
intlen)
else
new_node[new_len -1
] =node[len -1
];}//new_node元素個數為偶數
else
}create_tree(new_node, new_len);
delete new_node;}}
intbinarytree::min(
inta,
intb)
intbinarytree::search_second_small()
else
if(p
->
data ==p
->
right
->
data
&&second
>
p->
left
->
data)
else
return
second;
}return
second;
}binarytree::binarytree()
演算法導論習題解答 2 3 7
2.3 7 請給出乙個執行為 nlgn 的演算法 偽碼 使之能在給定乙個由n 個整數構成的集合s 和另乙個整數x 時,判斷出s 中是否存在有兩個其和等於x 的元素。解 解題思路 先對集合s進行歸併排序,然後新建乙個陣列s1,使得s1 i x s i 再將兩個陣列並起來。如果在並的過程中發現有兩個元素...
演算法導論6 5 7習題解答
clrs 6.5 7 heap delete a,i 操作將結點i中的項從堆a中刪去。對含n個元素的最大堆,請給出時間為o lgn 的heap delete的實現。演算法思想 對即將被刪的i處的元素設定為堆中末尾的元素,同時堆的大小減1.此題同時附帶6.2 5的解答 如下 1 include 2 u...
演算法導論12 2節習題解答
clrs 12.2 1 c錯,240及240之後的節點應該都為911左子樹上的節點,那麼所有節點必然小於或等於911,但點912明顯違反了。clrs 12.2 2 search minimum x if left x nil search minimum left x return x search...