<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=AproximateBinaryTree%2F%EA%B9%80%EC%83%81%EC%84%AD</id>
	<title>AproximateBinaryTree/김상섭 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=AproximateBinaryTree%2F%EA%B9%80%EC%83%81%EC%84%AD"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=AproximateBinaryTree/%EA%B9%80%EC%83%81%EC%84%AD&amp;action=history"/>
	<updated>2026-05-14T19:39:24Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=AproximateBinaryTree/%EA%B9%80%EC%83%81%EC%84%AD&amp;diff=28459&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:22, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=AproximateBinaryTree/%EA%B9%80%EC%83%81%EC%84%AD&amp;diff=28459&amp;oldid=prev"/>
		<updated>2021-02-07T05:22:31Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt; #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;vector&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;algorithm&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;numeric&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;math.h&amp;amp;gt;&lt;br /&gt;
 using namespace std;&lt;br /&gt;
 &lt;br /&gt;
 typedef struct data * data_pointer;&lt;br /&gt;
 struct data&lt;br /&gt;
 {&lt;br /&gt;
 	string name;&lt;br /&gt;
 	int value;&lt;br /&gt;
 	vector&amp;amp;lt;data&amp;amp;gt; nodes;&lt;br /&gt;
 	data_pointer left_child, right_child;	&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 bool comapare(data &amp;amp;amp; a, data &amp;amp;amp; b)&lt;br /&gt;
 {&lt;br /&gt;
 	return a.name &amp;amp;lt; b.name;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void init(data_pointer dp)&lt;br /&gt;
 {&lt;br /&gt;
 	dp-&amp;amp;gt;left_child = dp-&amp;amp;gt;right_child = NULL;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void createABT(data_pointer dp)&lt;br /&gt;
 {&lt;br /&gt;
 	if(dp)&lt;br /&gt;
 	{&lt;br /&gt;
 		&lt;br /&gt;
 		int left_sum = 0, right_sum= 0, min_index = 0;&lt;br /&gt;
 		double min_total_weight_sum, temp;&lt;br /&gt;
 		for(int i = 1; i &amp;amp;lt; dp-&amp;amp;gt;nodes.size(); i++)&lt;br /&gt;
 		{&lt;br /&gt;
 			right_sum +=dp-&amp;amp;gt;nodes[i].value;&lt;br /&gt;
 		}&lt;br /&gt;
 		&lt;br /&gt;
 		min_total_weight_sum = right_sum*sqrt(dp-&amp;amp;gt;nodes.size()-1);&lt;br /&gt;
 		for(i = 1; i &amp;amp;lt; dp-&amp;amp;gt;nodes.size(); i++)&lt;br /&gt;
 		{&lt;br /&gt;
 			left_sum += dp-&amp;amp;gt;nodes[i-1].value;&lt;br /&gt;
 			right_sum -= dp-&amp;amp;gt;nodes[i].value;&lt;br /&gt;
 			temp = left_sum*sqrt(i-1) + right_sum*sqrt(dp-&amp;amp;gt;nodes.size() - i - 1);&lt;br /&gt;
 			if(temp &amp;amp;lt; min_total_weight_sum)&lt;br /&gt;
 			{&lt;br /&gt;
 				min_total_weight_sum = temp;&lt;br /&gt;
 				min_index = i;&lt;br /&gt;
 			}		&lt;br /&gt;
 		}&lt;br /&gt;
 		dp-&amp;amp;gt;name = dp-&amp;amp;gt;nodes[min_index].name;&lt;br /&gt;
 		dp-&amp;amp;gt;value = dp-&amp;amp;gt;nodes[min_index].value;	&lt;br /&gt;
 		// 왼쪽 자식이 있을때&lt;br /&gt;
 		if(min_index != 0)&lt;br /&gt;
 		{&lt;br /&gt;
 			dp-&amp;amp;gt;left_child = new data;&lt;br /&gt;
 			init(dp-&amp;amp;gt;left_child);&lt;br /&gt;
 			for(int i = 0; i &amp;amp;lt; min_index; i++)&lt;br /&gt;
 				dp-&amp;amp;gt;left_child-&amp;amp;gt;nodes.push_back(dp-&amp;amp;gt;nodes[i]);&lt;br /&gt;
 			createABT(dp-&amp;amp;gt;left_child);&lt;br /&gt;
 		}&lt;br /&gt;
 		&lt;br /&gt;
 		// 오른쪽 자식이 있을때&lt;br /&gt;
 		if(min_index != dp-&amp;amp;gt;nodes.size()-1)&lt;br /&gt;
 		{&lt;br /&gt;
 			dp-&amp;amp;gt;right_child = new data;&lt;br /&gt;
 			init(dp-&amp;amp;gt;right_child);&lt;br /&gt;
 			for(int i = min_index +1; i &amp;amp;lt; dp-&amp;amp;gt;nodes.size(); i++)&lt;br /&gt;
 				dp-&amp;amp;gt;right_child-&amp;amp;gt;nodes.push_back(dp-&amp;amp;gt;nodes[i]);&lt;br /&gt;
 			createABT(dp-&amp;amp;gt;right_child);&lt;br /&gt;
 		}	&lt;br /&gt;
 		dp-&amp;amp;gt;nodes.clear();&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void show(data_pointer dp)&lt;br /&gt;
 {&lt;br /&gt;
 	if(dp)&lt;br /&gt;
 	{&lt;br /&gt;
 		show(dp-&amp;amp;gt;left_child);&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; dp-&amp;amp;gt;name &amp;amp;lt;&amp;amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
 		show(dp-&amp;amp;gt;right_child);&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int cost(data_pointer dp, int level)&lt;br /&gt;
 {&lt;br /&gt;
 	if(dp)&lt;br /&gt;
 	{&lt;br /&gt;
 		return cost(dp-&amp;amp;gt;left_child, level + 1) + cost(dp-&amp;amp;gt;right_child, level + 1) + dp-&amp;amp;gt;value * level;&lt;br /&gt;
 	}&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
 	int nodeNum, value;&lt;br /&gt;
 	data temp;&lt;br /&gt;
 	string name;&lt;br /&gt;
 	data_pointer root = new data;&lt;br /&gt;
 	init(root);&lt;br /&gt;
 	cin &amp;amp;gt;&amp;amp;gt; nodeNum;&lt;br /&gt;
 	for(int i = 0; i &amp;amp;lt; nodeNum; i++)&lt;br /&gt;
 	{&lt;br /&gt;
 		cin &amp;amp;gt;&amp;amp;gt; name &amp;amp;gt;&amp;amp;gt; value;&lt;br /&gt;
 		temp.name = name;&lt;br /&gt;
 		temp.value = value;&lt;br /&gt;
 		root-&amp;amp;gt;nodes.push_back(temp);&lt;br /&gt;
 	}&lt;br /&gt;
 	sort(root-&amp;amp;gt;nodes.begin(),root-&amp;amp;gt;nodes.end(),comapare);&lt;br /&gt;
 	createABT(root);&lt;br /&gt;
 	show(root);&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; cost(root,1) &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>