<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dutor &#187; 数据结构</title>
	<atom:link href="http://www.dutor.net/index.php/tag/data-struct/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dutor.net</link>
	<description>熟读而精思，循序而渐进，厚积而薄发。</description>
	<lastBuildDate>Tue, 17 Jan 2012 14:44:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>AVL平衡树实现</title>
		<link>http://www.dutor.net/index.php/2009/11/avl-tree-implementation/</link>
		<comments>http://www.dutor.net/index.php/2009/11/avl-tree-implementation/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 14:29:00 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[AVL]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1663</guid>
		<description><![CDATA[　　这里只给出一个简单的实现，具体原理参见Google、Baidu的各个角落及各大教材。做两点说明：
仅仅实现了必要的左旋、右旋处理，左平衡、右平衡操作，以及数据的插入操作，
不可重复插入数据。
<pre lang="cpp" line="1">
typedef int Type; //~ 节点数据类型
typedef struct Node
{
	Type data;
	int bf;
	Node *left, *right;
	Node(){ bf = 0; left = right = 0; }
} AVLNode, *AVLTree; //~ 平衡树及其节点

void RRotate(AVLTree &#038; T) //~ 右旋处理,T的左孩子成为新子树根
{
	AVLNode * tmp = T->left;
	T->left = tmp->right;
	tmp->right = T;
	T = tmp;
}
</pre>]]></description>
			<content:encoded><![CDATA[<p>　　这里只给出一个简单的实现，具体原理参见Google、Baidu的各个角落及各大教材。做两点说明：<br />
仅仅实现了必要的左旋、右旋处理，左平衡、右平衡操作，以及数据的插入操作，<br />
不可重复插入数据。</p>

<div class="wp_codebox"><table><tr id="p16631"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
</pre></td><td class="code" id="p1663code1"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">int</span> Type<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 节点数据类型</span>
<span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">struct</span> Node
<span style="color: #008000;">&#123;</span>
	Type data<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> bf<span style="color: #008080;">;</span>
	Node <span style="color: #000040;">*</span>left, <span style="color: #000040;">*</span>right<span style="color: #008080;">;</span>
	Node<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span> bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> left <span style="color: #000080;">=</span> right <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span> AVLNode, <span style="color: #000040;">*</span>AVLTree<span style="color: #008080;">;</span> <span style="color: #666666;">//~ 平衡树及其节点</span>
&nbsp;
<span style="color: #0000ff;">void</span> RRotate<span style="color: #008000;">&#40;</span>AVLTree <span style="color: #000040;">&amp;</span> T<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 右旋处理,T的左孩子成为新子树根</span>
<span style="color: #008000;">&#123;</span>
	AVLNode <span style="color: #000040;">*</span> tmp <span style="color: #000080;">=</span> T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>left<span style="color: #008080;">;</span>
	T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>left <span style="color: #000080;">=</span> tmp<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>right<span style="color: #008080;">;</span>
	tmp<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>right <span style="color: #000080;">=</span> T<span style="color: #008080;">;</span>
	T <span style="color: #000080;">=</span> tmp<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> LLotate<span style="color: #008000;">&#40;</span>AVLTree <span style="color: #000040;">&amp;</span> T<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 左旋处理,T的右孩子成为新子树根</span>
<span style="color: #008000;">&#123;</span>
	AVLNode <span style="color: #000040;">*</span> tmp <span style="color: #000080;">=</span> T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>right<span style="color: #008080;">;</span>
	T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>right <span style="color: #000080;">=</span> tmp<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>left<span style="color: #008080;">;</span>
	tmp<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>left <span style="color: #000080;">=</span> T<span style="color: #008080;">;</span>
	T <span style="color: #000080;">=</span> tmp<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> LBalance<span style="color: #008000;">&#40;</span>AVLTree <span style="color: #000040;">&amp;</span> T<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 左平衡处理</span>
<span style="color: #008000;">&#123;</span>
	AVLNode <span style="color: #000040;">*</span> l <span style="color: #000080;">=</span> T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>left<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">switch</span><span style="color: #008000;">&#40;</span>l<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ LL,单右旋转</span>
			RRotate<span style="color: #008000;">&#40;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> l<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 更新平衡因子</span>
			<span style="color: #0000ff;">return</span> <span style="color: #008080;">;</span>
		<span style="color: #0000ff;">case</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ LR双旋转</span>
			AVLNode <span style="color: #000040;">*</span> lr <span style="color: #000080;">=</span> l<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>right<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">switch</span><span style="color: #008000;">&#40;</span>lr<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 更新平衡因子</span>
			<span style="color: #008000;">&#123;</span>
				<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">:</span>
					l<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
					T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">case</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">:</span>
					T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
					l<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span><span style="color: #666666;">// switch</span>
			lr<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
			LLotate<span style="color: #008000;">&#40;</span>l<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			RRotate<span style="color: #008000;">&#40;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span><span style="color: #666666;">// switch</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> RBalance<span style="color: #008000;">&#40;</span>AVLTree <span style="color: #000040;">&amp;</span> T<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 右平衡处理</span>
<span style="color: #008000;">&#123;</span>
	AVLNode <span style="color: #000040;">*</span> r <span style="color: #000080;">=</span> T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>right<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">switch</span><span style="color: #008000;">&#40;</span>r<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">case</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ RR,单左旋转</span>
			LLotate<span style="color: #008000;">&#40;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> r<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">return</span> <span style="color: #008080;">;</span>
		<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ RL双旋转</span>
			AVLNode <span style="color: #000040;">*</span> rl <span style="color: #000080;">=</span> r<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>left<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">switch</span><span style="color: #008000;">&#40;</span>rl<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf<span style="color: #008000;">&#41;</span><span style="color: #666666;">//~ 更新平衡因子</span>
			<span style="color: #008000;">&#123;</span>
				<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">:</span>
					r<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
					T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">case</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">:</span>
					T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
					r<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span><span style="color: #666666;">// switch</span>
			rl<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
			RRotate<span style="color: #008000;">&#40;</span>r<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			LLotate<span style="color: #008000;">&#40;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span><span style="color: #666666;">// switch</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">bool</span> Insert<span style="color: #008000;">&#40;</span>AVLTree <span style="color: #000040;">&amp;</span> T, Type <span style="color: #000040;">&amp;</span> data<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 通过插入操作构建AVL树</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">bool</span> taller <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 标识此次插入操作是否使该树长高</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>T<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 该子树为空树，长高</span>
	<span style="color: #008000;">&#123;</span>
		T <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> AVLNode<span style="color: #008080;">;</span>
		T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>data <span style="color: #000080;">=</span> data<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> taller<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span> <span style="color: #666666;">// if</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>data <span style="color: #000080;">==</span> T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>data<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 该数据已存在，不重复插入</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>data <span style="color: #000080;">&lt;</span> T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>data<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 需要将该数据插入左子树</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>Insert<span style="color: #008000;">&#40;</span>T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>left, data<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 左子树未长高</span>
		<span style="color: #0000ff;">switch</span><span style="color: #008000;">&#40;</span>T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//~ 左子树长高，判断是否需要调整</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ 失衡，许进行左平衡调整</span>
				LBalance<span style="color: #008000;">&#40;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ 未失衡，只需调整当前节点的平衡因子</span>
				T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ 未失衡，只需调整当前节点的平衡因子</span>
				T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span> <span style="color: #666666;">// switch</span>
	<span style="color: #008000;">&#125;</span> <span style="color: #666666;">// if</span>
	<span style="color: #0000ff;">else</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>Insert<span style="color: #008000;">&#40;</span>T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>left, data<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">switch</span><span style="color: #008000;">&#40;</span>T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ 未失衡，只需调整当前节点的平衡因子</span>
				T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ 未失衡，只需调整当前节点的平衡因子</span>
				T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>bf <span style="color: #000080;">=</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">case</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">:</span> <span style="color: #666666;">//~ 失衡，许进行右平衡调整</span>
				RBalance<span style="color: #008000;">&#40;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span> <span style="color: #666666;">// switch</span>
	<span style="color: #008000;">&#125;</span> <span style="color: #666666;">// if</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/11/avl-tree-implementation/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>最小堆</title>
		<link>http://www.dutor.net/index.php/2009/10/minimum-heap/</link>
		<comments>http://www.dutor.net/index.php/2009/10/minimum-heap/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 13:48:23 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[排序]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1396</guid>
		<description><![CDATA[　　一个最小堆的C++模板。什么东西都想封装成类，做成模板，即使它仅仅就是一个普通的函数，尤其是用到一些全局的对象时，觉得封装成类看起来更紧凑一点，使用起来也更方便更顺手一些。这个最小堆模板实现了以下几个小特性：
　　容量不足时，能够动态地调整大小；
　　可以用一个数组来初始化，并建立最小堆；
　　没有复制构造，^*^.]]></description>
			<content:encoded><![CDATA[<p>　　一个最小堆的C++模板。什么东西都想封装成类，做成模板，即使它仅仅就是一个普通的函数，尤其是用到一些全局的对象时，觉得封装成类看起来更紧凑一点，使用起来也更方便更顺手一些。这个最小堆模板实现了以下几个小特性：<br />
　　容量不足时，能够动态地调整大小；<br />
　　可以用一个数组来初始化，并建立最小堆；<br />
　　没有复制构造，^*^.</p>

<div class="wp_codebox"><table><tr id="p13962"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
</pre></td><td class="code" id="p1396code2"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">class</span> Heap
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
        <span style="color: #666666;">//~ 构造容量n的堆</span>
        Heap<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">size_t</span> n <span style="color: #000080;">=</span> <span style="color: #0000dd;">64</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #666666;">//~ 以数组构造</span>
        Heap<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> T<span style="color: #000040;">*</span> beg, <span style="color: #0000ff;">const</span> T<span style="color: #000040;">*</span> end<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        ~Heap<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #0000dd;">delete</span> <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> pHeap<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span>
        <span style="color: #666666;">//~ 添加元素</span>
        <span style="color: #0000ff;">void</span> push<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> item<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #666666;">//~ 返回并删除堆顶元素</span>
        T pop<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #666666;">//~ 返回堆顶元素的引用</span>
        T<span style="color: #000040;">&amp;</span> top<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #0000ff;">const</span><span style="color: #008080;">;</span><span style="color: #666666;">//! 不允许修改！</span>
        <span style="color: #0000ff;">size_t</span> size<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span><span style="color: #008080;">;</span><span style="color: #666666;">//~ 当前元素个数</span>
        <span style="color: #0000ff;">size_t</span> capacity<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span><span style="color: #008080;">;</span><span style="color: #666666;">//~ 当前容量</span>
    <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
        <span style="color: #0000ff;">void</span> resize<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//~ 重新调整堆容量</span>
        <span style="color: #0000ff;">void</span> adjust<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//~ 调整以i为根的子树为最小堆</span>
        T <span style="color: #000040;">*</span> pHeap<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">size_t</span> _size<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">size_t</span> _capacity<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
Heap<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">Heap</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">size_t</span> n<span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span> pHeap<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">new</span> T<span style="color: #008000;">&#91;</span>n<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    _size <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    _capacity <span style="color: #000080;">=</span> n<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
Heap<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">Heap</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> T<span style="color: #000040;">*</span> beg,<span style="color: #0000ff;">const</span> T<span style="color: #000040;">*</span> end<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    _capacity <span style="color: #000080;">=</span> _size <span style="color: #000080;">=</span> end <span style="color: #000040;">-</span> beg<span style="color: #008080;">;</span>
    pHeap <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> T<span style="color: #008000;">&#91;</span>_size<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> _size<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        pHeap<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>beg<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> _size <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #666666;">//~ 调用adjust(int)构造最小堆</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span> <span style="color: #008080;">;</span> i <span style="color: #000080;">&gt;=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #000040;">--</span>i<span style="color: #008000;">&#41;</span>
        adjust<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> Heap<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">push</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> item<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">//~ 容量不足时重新分配空间</span>
    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>_size <span style="color: #000080;">==</span> _capacity<span style="color: #008000;">&#41;</span>
        resize<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    _size<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> _size <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #666666;">//~ 通过上溯寻找合适的插入位置</span>
    <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>i <span style="color: #000040;">&amp;&amp;</span> pHeap<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#40;</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> item<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        pHeap<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> pHeap<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#40;</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        i <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">/</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    pHeap<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> item<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
T Heap<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">//~ assert(_size);</span>
    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>_size <span style="color: #000080;">&lt;=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #0000dd;">exit</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    T rt <span style="color: #000080;">=</span> pHeap<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #666666;">//~ 先将堆尾元素置顶，然后重建</span>
    pHeap<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> pHeap<span style="color: #008000;">&#91;</span><span style="color: #000040;">--</span>_size<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>_size<span style="color: #008000;">&#41;</span>
        adjust<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> rt<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
T<span style="color: #000040;">&amp;</span> Heap<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">top</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// assert(_size);</span>
    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>_size <span style="color: #000080;">&lt;=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #0000dd;">exit</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> pHeap<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">size_t</span> Heap<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">return</span> _size<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">size_t</span> Heap<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">capacity</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">return</span> _capacity<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> Heap<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">resize</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    T <span style="color: #000040;">*</span> org <span style="color: #000080;">=</span> pHeap<span style="color: #008080;">;</span>
    <span style="color: #666666;">//~ 调整容量</span>
    _capacity <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span><span style="color: #000040;">*</span>_capacity <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    pHeap <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> T<span style="color: #008000;">&#91;</span>_capacity<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #666666;">//~ 复制堆</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> _size<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        pHeap<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> org<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000dd;">delete</span> <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> org<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> Heap<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">adjust</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">//~ 重建以i为根的最小堆，假定其左右子树已是最小堆</span>
    <span style="color: #0000ff;">size_t</span> minpos<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">2</span> <span style="color: #000040;">*</span> i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span> <span style="color: #000080;">&lt;</span> _size<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        minpos <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">2</span> <span style="color: #000040;">*</span> i <span style="color: #000040;">+</span> <span style="color: #0000dd;">2</span> <span style="color: #000080;">&lt;</span> _size <span style="color: #000040;">&amp;&amp;</span> pHeap<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #000040;">*</span>i<span style="color: #000040;">+</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;</span> pHeap<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
            minpos <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span> <span style="color: #000040;">*</span> i <span style="color: #000040;">+</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>pHeap<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #000040;">*</span>i<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;</span> pHeap<span style="color: #008000;">&#91;</span>minpos<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
            minpos <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span> <span style="color: #000040;">*</span> i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>minpos <span style="color: #000080;">==</span> i<span style="color: #008000;">&#41;</span>
            <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
        swap<span style="color: #008000;">&#40;</span>pHeap<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>, pHeap<span style="color: #008000;">&#91;</span>minpos<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        i <span style="color: #000080;">=</span> minpos<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/10/minimum-heap/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>反转链表小算法</title>
		<link>http://www.dutor.net/index.php/2009/08/reverse-list/</link>
		<comments>http://www.dutor.net/index.php/2009/08/reverse-list/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 04:39:51 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1114</guid>
		<description><![CDATA[<pre lang="cpp" line="1">
void reverse(Node * T)
{
	assert(T); //~ 表头非空
	Node* p = T->next, *t;
	if(p)
	{	//~ 将第一个结点，即未来的表尾next域置空
		t = p->next;
		p->next = NULL;
		p = t;
	}
	while(p)
	{	//~ 将余下结点依次插入表头
		t = p->next;
		p->next = T->next;
		T->next = p;
		p = t;
	}
}
</pre>]]></description>
			<content:encoded><![CDATA[<p>基本思想是，从链表的第二个结点(如果存在的话)开始，依次插入到链表的头结点后面，即作为第一个结点，直至表尾，此时链表反转工作已经完成。</p>

<div class="wp_codebox"><table><tr id="p11143"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
</pre></td><td class="code" id="p1114code3"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cassert&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">struct</span> Node
<span style="color: #008000;">&#123;</span>
	Node<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span>data<span style="color: #008000;">&#40;</span>n<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">int</span> data<span style="color: #008080;">;</span>
	Node<span style="color: #000040;">*</span> next<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span> 
<span style="color: #0000ff;">void</span> reverse<span style="color: #008000;">&#40;</span>Node <span style="color: #000040;">*</span> T<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">assert</span><span style="color: #008000;">&#40;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//~ 表头非空</span>
	Node<span style="color: #000040;">*</span> p <span style="color: #000080;">=</span> T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next, <span style="color: #000040;">*</span>t<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>p<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>	<span style="color: #666666;">//~ 将第一个结点，即未来的表尾next域置空</span>
		t <span style="color: #000080;">=</span> p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008080;">;</span>
		p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
		p <span style="color: #000080;">=</span> t<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>p<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>	<span style="color: #666666;">//~ 将余下结点依次插入表头</span>
		t <span style="color: #000080;">=</span> p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008080;">;</span>
		p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next <span style="color: #000080;">=</span> T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008080;">;</span>
		T<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next <span style="color: #000080;">=</span> p<span style="color: #008080;">;</span>
		p <span style="color: #000080;">=</span> t<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">//~ 测试代码</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	Node <span style="color: #000040;">*</span>head <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> Node, <span style="color: #000040;">*</span>t <span style="color: #000080;">=</span> head<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		t<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> Node<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		t <span style="color: #000080;">=</span> t<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	t<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
&nbsp;
	Node <span style="color: #000040;">*</span> p <span style="color: #000080;">=</span> head<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008080;">;</span>
	reverse<span style="color: #008000;">&#40;</span>head<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>p<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>data<span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
		p <span style="color: #000080;">=</span> p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/reverse-list/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>又一个stack模板</title>
		<link>http://www.dutor.net/index.php/2009/08/another-stack-template/</link>
		<comments>http://www.dutor.net/index.php/2009/08/another-stack-template/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 01:26:08 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[模板]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1109</guid>
		<description><![CDATA[有一点需要注意的是，由于STL内的容器的析构函数都不是virtual的，所以，继承这些容器的类(或者模板类)不能用于多态！这也是不提倡继承STL容器的原因。

不过，由于上面的代码中mstack<T>继承自STL模板容器vector<T>，其自身并没有任何成员；
继承vector的目的不是使用多态特性，仅仅是复用了vector的接口而已，且复用也仅仅是内部复用；
由于是私有继承，你无法调用父类vector的接口，子类与父类接口并不一致，在语法就不能用于多态；
综上所述，这样的继承并没有什么潜在的危险。]]></description>
			<content:encoded><![CDATA[<p>受Felix牛启发，用vector实现了一个stack模板：</p>

<div class="wp_codebox"><table><tr id="p11094"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
</pre></td><td class="code" id="p1109code4"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;vector&gt;</span>
<span style="color: #339900;">#include &lt;cassert&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">class</span> mstack<span style="color: #008080;">:</span> <span style="color: #0000ff;">private</span> vector<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span>  <span style="color: #666666;">//~ 私有继承自vector&lt;T&gt; :)</span>
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	mstack<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">size_t</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #666666;">//~ 接口声明 :)</span>
	<span style="color: #0000ff;">void</span> push<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> T <span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">void</span> pop<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	T<span style="color: #000040;">&amp;</span> top<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">void</span> clear<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">size_t</span> size<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">bool</span> empty<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #666666;">//~ 接口实现 :)</span>
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
mstack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">mstack</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">size_t</span> _size<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>_size<span style="color: #008000;">&#41;</span>
		vector<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">reserve</span><span style="color: #008000;">&#40;</span>_size<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> mstack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">push</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> T <span style="color: #000040;">&amp;</span>t<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	vector<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> mstack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">assert</span><span style="color: #008000;">&#40;</span>vector<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	vector<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span>vector<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
T<span style="color: #000040;">&amp;</span> mstack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">top</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>vector<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> mstack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">clear</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	vector<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">clear</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">size_t</span> mstack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> vector<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">bool</span> mstack<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">empty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> vector<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #666666;">//~ 测试代码 :)</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	mstack<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> stk<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
		stk.<span style="color: #007788;">push</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	stk.<span style="color: #007788;">push</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">100</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>stk.<span style="color: #007788;">top</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	stk.<span style="color: #007788;">pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>stk.<span style="color: #007788;">top</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>stk.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	stk.<span style="color: #007788;">clear</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>stk.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #666666;">//~ cout&lt;&lt;stk.capacity()&lt;&lt;endl; private inherit from vector&lt;T&gt; :(</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>有一点需要注意的是，由于STL内的容器的析构函数都不是virtual的，所以，继承这些容器的类(或者模板类)不能用于多态！这也是不提倡继承STL容器的原因。</p>
<p>不过，由于上面的代码中mstack<T>继承自STL模板容器vector<T>，其自身并没有任何成员；<br />
继承vector的目的不是使用多态特性，仅仅是复用了vector的接口而已，且复用也仅仅是内部复用；<br />
由于是私有继承，你无法调用父类vector的接口，子类与父类接口并不一致，在语法就不能用于多态；<br />
综上所述，这样的继承并没有什么潜在的危险。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/another-stack-template/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>由遍历序列恢复二叉树</title>
		<link>http://www.dutor.net/index.php/2009/08/generate-btree/</link>
		<comments>http://www.dutor.net/index.php/2009/08/generate-btree/#comments</comments>
		<pubDate>Fri, 14 Aug 2009 00:44:34 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1061</guid>
		<description><![CDATA[<pre lang="cpp" line="1">
/*
 * pre存放先序序列，
 * in存放中序序列，
 * n为结点个数，
 * 返回二叉树根指针
 */
BTree CreateBT(Type * pre, Type * in, int n)
{
	if(n <= 0)
		return NULL;
	BTree bt = new BTNode;
	Type * p;
	int k;
	bt->data = *pre;
	for(p = in; p < in + n; ++p)
		if(*pre == *p)
			break;
	k = p - in;
	bt->lchild = CreateBT(pre+1, in, k);
	bt->rchild = CreateBT(pre+k+1, p+1, n-k-1);
        return bt;	
}
</pre>]]></description>
			<content:encoded><![CDATA[<p>各种计算机考试中，几乎都有这样的问题，给定二叉树先序、中序、后序、层次遍历的其中两种遍历序列，要求我们来恢复这棵二叉树。以先序、中序序列为例，由先序遍历的特点可知，先序序列的第一个元素R一定是二叉树的根结点，在中序序列中找到该结点，则此结点的左侧m个结点就是二叉树的左子树，右侧n个结点便是二叉树的右子树。先序序列中根结点后的m个结点为左子树，剩下n个结点为右子树。分别针对左右子树递归地寻找其根结点及其左右子树，便可恢复原二叉树。对于从中序、后序等其他遍历序列恢复二叉树的方法，大致雷同。写了段代码，实现从先序、中序遍历序列恢复二叉树：</p>

<div class="wp_codebox"><table><tr id="p10615"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code" id="p1061code5"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/*
 * pre存放先序序列，
 * in存放中序序列，
 * n为结点个数，
 * 返回二叉树根指针
 */</span>
BTree CreateBT<span style="color: #008000;">&#40;</span>Type <span style="color: #000040;">*</span> pre, Type <span style="color: #000040;">*</span> in, <span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>n <span style="color: #000080;">&lt;=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
	BTree bt <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> BTNode<span style="color: #008080;">;</span>
	Type <span style="color: #000040;">*</span> p<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> k<span style="color: #008080;">;</span>
	bt<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>data <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>pre<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span>p <span style="color: #000080;">=</span> in<span style="color: #008080;">;</span> p <span style="color: #000080;">&lt;</span> in <span style="color: #000040;">+</span> n<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>p<span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>pre <span style="color: #000080;">==</span> <span style="color: #000040;">*</span>p<span style="color: #008000;">&#41;</span>
			<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
	k <span style="color: #000080;">=</span> p <span style="color: #000040;">-</span> in<span style="color: #008080;">;</span>
	bt<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>lchild <span style="color: #000080;">=</span> CreateBT<span style="color: #008000;">&#40;</span>pre<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>, in, k<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	bt<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>rchild <span style="color: #000080;">=</span> CreateBT<span style="color: #008000;">&#40;</span>pre<span style="color: #000040;">+</span>k<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>, p<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>, n<span style="color: #000040;">-</span>k<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span> bt<span style="color: #008080;">;</span>	
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/generate-btree/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AVL左转转右转转</title>
		<link>http://www.dutor.net/index.php/2009/08/avl_rotate/</link>
		<comments>http://www.dutor.net/index.php/2009/08/avl_rotate/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 11:23:42 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之算法神奇]]></category>
		<category><![CDATA[边走编程]]></category>
		<category><![CDATA[AVL]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1048</guid>
		<description><![CDATA[严老太，在您面前小孙孙我实在心智底下啊！一个AVL就把我整的团团转，单向右旋，单向左旋，双向旋转先左后右，双向旋转先右后左，很简单的道理，您就是不肯轻易说出来，在那转啊转的，貌似很神秘的样子！

在构造AVL树的时候，会出现插入某个节点后输不再平衡的情况，这时候只需要找到离插入点最近的、平衡因子不合法的节点，调整以此节点为根的子树(*)，使其平衡因子合法，其实就是使这棵子树(*)的高度与插入节点前相比不发生变化。具体的调整策略因具体情况而异，但原则都是一样的：首先应该明确根节点大于左孩子而小于右孩子，另外，调整后的子树(*)的根是一定会发生变化的，且变化后的子树应该满足平衡条件，即平衡因子为1，0，-1之一。
<img alt="rotate sample" src="http://www.dutor.net/files/images/avl_rotate.gif" title="avl_rotate" width="602" height="281" />]]></description>
			<content:encoded><![CDATA[<p>严老太，在您面前小孙孙我实在心智底下啊！一个AVL就把我整的团团转，单向右旋，单向左旋，双向旋转先左后右，双向旋转先右后左，很简单的道理，您就是不肯轻易说出来，在那转啊转的，貌似很神秘的样子！</p>
<p>在构造AVL树的时候，会出现插入某个节点后输不再平衡的情况，这时候只需要找到离插入点最近的、平衡因子不合法的节点，调整以此节点为根的子树(*)，使其平衡因子合法，其实就是使这棵子树(*)的高度与插入节点前相比不发生变化。具体的调整策略因具体情况而异，但原则都是一样的：首先应该明确根节点大于左孩子而小于右孩子，另外，调整后的子树(*)的根是一定会发生变化的，且变化后的子树应该满足平衡条件，即平衡因子为1，0，-1之一。</p>
<p>这里有一个图示，<br />
<div class="wp-caption aligncenter" style="width: 612px"><img alt="rotate sample" src="http://www.dutor.net/files/images/avl_rotate.gif" title="avl_rotate" width="602" height="281" /><p class="wp-caption-text">rotate sample</p></div></p>
<p>还有两个，</p>
<div class="wp-caption aligncenter" style="width: 581px"><img alt="/型" src="http://www.dutor.net/files/images/avl_rotate2.jpg" title="AVL" width="571" height="284" /><p class="wp-caption-text">&quot;/&quot;型</p></div>
<div class="wp-caption aligncenter" style="width: 634px"><img alt="型" src="http://www.dutor.net/files/images/avl_rotate3.jpg" title="avl" width="624" height="353" /><p class="wp-caption-text">&quot;&lt;&quot;型</p></div>
<p>这里还有两段示例代码，</p>

<div class="wp_codebox"><table><tr id="p10486"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code" id="p1048code6"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> R_Rotate <span style="color: #008000;">&#40;</span>BSTree <span style="color: #000040;">&amp;</span>p<span style="color: #008000;">&#41;</span> 
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">//~ 对以*p为根的二叉排序树作右旋转处理，处理之后p指向新的树根结点，即旋转</span>
    <span style="color: #666666;">//~ 处理之前的左子树的根结点</span>
    lc<span style="color: #000080;">=</span>p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>lchild <span style="color: #008080;">;</span>            <span style="color: #666666;">//~ lc指向的*p的左子树根结点</span>
    p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>lchild<span style="color: #000080;">=</span>lc<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>rchild <span style="color: #008080;">;</span>    <span style="color: #666666;">//~ lc的右子树挂接为*p的左子树</span>
    lc<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>rchild<span style="color: #000080;">=</span>p <span style="color: #008080;">;</span> p<span style="color: #000080;">=</span>lc <span style="color: #008080;">;</span>    <span style="color: #666666;">//~ p指向新的根结点</span>
<span style="color: #008000;">&#125;</span><span style="color: #666666;">//~ R_Rotate</span>
&nbsp;
<span style="color: #0000ff;">void</span> L_Rotate <span style="color: #008000;">&#40;</span>BSTree <span style="color: #000040;">&amp;</span>p<span style="color: #008000;">&#41;</span>    
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">//~ 对以*p为根的二叉排序树作左旋处理，处理之后p指向新的树根结点，即旋转</span>
    <span style="color: #666666;">//~ 处理之前的右子树的根结点</span>
    rc<span style="color: #000080;">=</span>p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>rchild <span style="color: #008080;">;</span>            <span style="color: #666666;">//~ rc指向的*p的右子树根结点</span>
    p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>rchild<span style="color: #000080;">=</span>rc<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>lchild <span style="color: #008080;">;</span>  <span style="color: #666666;">//~ rc左子树挂接为*p的右子树</span>
    rc<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>lchild<span style="color: #000080;">=</span>p <span style="color: #008080;">;</span> p<span style="color: #000080;">=</span>rc <span style="color: #008080;">;</span>   <span style="color: #666666;">//~ p指向新的根结点</span>
<span style="color: #008000;">&#125;</span><span style="color: #666666;">//~ L_Rotate</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/avl_rotate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AVL的定义</title>
		<link>http://www.dutor.net/index.php/2009/08/definition-avl/</link>
		<comments>http://www.dutor.net/index.php/2009/08/definition-avl/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 08:07:51 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[边走编程]]></category>
		<category><![CDATA[AVL]]></category>
		<category><![CDATA[数据结构]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=1041</guid>
		<description><![CDATA[AVL是一种二叉搜索树(Binary Search Tree)，被称为平衡树(Balanced Binary Tree)，由Adelsonr Velskii 和Landis 提出并以他们的名字命名。

今天看严蔚敏老太太的数据结构，她老人家是这么描述AVL的：AVL，它或者是一棵空树，或者是具有以下性质的二叉树：它的左子树和右子树都是平衡二叉树，且左子树和右子树的深度之差(平衡因子：BF)的绝对值不超过1。看着这么个定义很别扭，总觉得对平衡因子的要求比较弱，也可能是我悟性较弱吧，在这句话上我很是下了一番功夫……如果这样来定义的话，可能会让我更容易理解一些：
<ol>
	<li>根的左子树和右子树的高度差的最大值为1，空树的高度为0。</li>
	<li>根的左子树和右子树都是AVL树。</li>
</ol>
]]></description>
			<content:encoded><![CDATA[<p>AVL是一种二叉搜索树(Binary Search Tree)，被称为平衡树(Balanced Binary Tree)，由Adelsonr Velskii 和Landis 提出并以他们的名字命名。</p>
<p>今天看严蔚敏老太太的数据结构，她老人家是这么描述AVL的：AVL，它或者是一棵空树，或者是具有以下性质的二叉树：它的左子树和右子树都是平衡二叉树，且左子树和右子树的深度之差(平衡因子：BF)的绝对值不超过1。看着这么个定义很别扭，总觉得对平衡因子的要求比较弱，也可能是我悟性较弱吧，在这句话上我很是下了一番功夫……如果这样来定义的话，可能会让我更容易理解一些：</p>
<ol>
<li>根的左子树和右子树的高度差的最大值为1，空树的高度为0。</li>
<li>根的左子树和右子树都是AVL树。</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/08/definition-avl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关联容器set,multiset,map,multimap</title>
		<link>http://www.dutor.net/index.php/2009/05/set-multiset-map-multimap/</link>
		<comments>http://www.dutor.net/index.php/2009/05/set-multiset-map-multimap/#comments</comments>
		<pubDate>Wed, 13 May 2009 22:30:13 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[之语言特性]]></category>
		<category><![CDATA[Cpp]]></category>
		<category><![CDATA[STL]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=454</guid>
		<description><![CDATA[<strong>关联式容器associative container:</strong>


<blockquote>被插入的元素并没有一个固定的位置。这不仅是指操作者可能更改其中元素的位置，还有可能——每当新插入一个元素时，容器都会自动的按照某种排序规则将新来的元素放置在合适的位置。也即，这种容器内元素的排列顺序由容器自己的排序规则决定，操作者无能为力。</blockquote>]]></description>
			<content:encoded><![CDATA[<p><strong>关联式容器associative container:</strong></p>
<blockquote><p>被插入的元素并没有一个固定的位置。这不仅是指操作者可能更改其中元素的位置，还有可能——每当新插入一个元素时，容器都会自动的按照某种排序规则将新来的元素放置在合适的位置。也即，这种容器内元素的排列顺序由容器自己的排序规则决定，操作者无能为力。</p></blockquote>
<p><em>Set(multiset)</em></p>
<pre>
|
|->名称----->set
|->个性
|      |------> ①set的底层实现是基于平衡二叉树的(当然标准书中并没有这么规定）
|      |------> ②由于关联式容器是顺序的，那么set就不允许对其中的元素作直接的修改，否则所谓的关联式将不再关联——容器中的元素已经不再符合某种顺序了。
|      |------> ③set的排序规则有两种确定方式，一是采用模板参数，一是采用构造参数。前者使得排序规则成为set类型的一部分（在对整个容器作比较等运算的时候，这个是比需的）；后者仅在构造一个实例对像的时候用到，但其类型不会改变（虽然排序规则发生了变化），此处的排序规则通常比模板参数中的规则具有更高的优先级。
|      |------> ④由于STL基本上采用的是reference语义，故要求其元素必须具备assignable,copyable,comparable。
|
|->陷阱
|      |------> ①insert和erase的参数类型不一样的时候其返回的类型也是不一样的。对于set而言，insert(value)会返回一个pair(pos,bool)，而insert(pos)则同样返回一个iterator的pos；erase(value)会返回被删除元素的个数，而erase(pos)则不会返回任何东西，它实际上是一个过程式的成员函数。
|      |------> ②两个set容器的比较是按照字典的方式进行的。但一定要注意，比较的两个set容器必须要具有相同的类型，特别是在模板参数中给出了排序规则参数的时候，就得注意这些参数是否一致——该参数同样决定着你所用的set的类型。
|
|->说明----->multiset与set的用法基本一样，不同的是它允许出现相同的值得元素。
|
|->Type----->class
|->Include---><set>
|->Define---->set<class T,optional compare,optional>
|->Sub
|      |------>constructor
|                      |->default,copy,assignmet
|->Fun
       |------>NoModify operate
       |               |->.size() .max_size() .empty() (各种compare operator)
       |------>seek operator
       |               |->.count(elem) .find(elem) .lower_bound(elem) .upper_bound(elem)
       |                    .equal_range(elem)
       |------>iterator
       |               |->.begin() .end() .rbegin() .rend()
       |------>add&#038;del
                       |->.insert(elem) .insert(pos,elem) .insert(beg,end)
                       |->.erase(elem) .erase(pos) .erase(beg,end) .clear()
</pre>
<hr />
<em>Map(mulitmap)</em></p>
<pre>
|
|->名称----->map
|->个性
|      |------> ①map与set的最大区别在于map是一种特殊的set，它的所有元素都是pair<key,value>
|      |------> ②map最大的特性在于map提供了下标subscript操作的能力，你可以向数组一样操作map[key]来引用相应的值。这个除了方便以外同样也是问题的根源。
|      |------> ③几乎所有针对map的操作都是基于key的。比如，排序就是通过比较key来进行的。
|      |------> ④对于set成立的操作在map中基本上都成立
S
|
|->陷阱
|      |------> ①如果你采用了这样的语句erase(pos)——其中的pos是个iterator，那么最好不要在对该pos最任何操作，应为erase(pos)已经将这个pos删除了，此后任何关于pos的操作都视为定义的。这种情况要是发生在for循环中，for(pos=.begin(),pos!=.end(),pos++)就能解决问题了。
|      |------> ②假设代码中有这样的语句，cout<
<map[key],按理这是没有问题的，但是如果你的key在map中原本是不存在的，那么这句代码会“自作聪明”的帮你在map中将上一个该key的value为default的元素，这恐怕不是件好事。
|      |------> ③map[key]=value的操作要比insert(value)的方式慢。
|
|->说明------>multimap的操作与map大致一样，不同在于multimap允许有相同的key在容器中存在。
|
|->Type----->class
|->Include--->
<map>
|->Define---->map<key,value,optional compare ,optional>
|->Sub
|->Fun
       |------>map和set基本具有相同的操作。
       |------> 不同的是map的insert(elem)不再返回一个pair而是一个pos的iterator。
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/05/set-multiset-map-multimap/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>B树B-树B+树B*树</title>
		<link>http://www.dutor.net/index.php/2009/05/tree-b-b-b/</link>
		<comments>http://www.dutor.net/index.php/2009/05/tree-b-b-b/#comments</comments>
		<pubDate>Wed, 13 May 2009 05:59:48 +0000</pubDate>
		<dc:creator>dutor</dc:creator>
				<category><![CDATA[边走编程]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://www.dutor.net/?p=440</guid>
		<description><![CDATA[<strong>B树</strong>
即二叉搜索树：
<ul>
	<li>所有非叶子结点至多拥有两个儿子（Left和Right）；</li>
	<li>所有结点存储一个关键字；</li>
	<li> 非叶子结点的左指针指向小于其关键字的子树，右指针指向大于其关键字的子树；</li>
</ul>
]]></description>
			<content:encoded><![CDATA[<p><strong>B树</strong><br />
即二叉搜索树：</p>
<ul>
<li>所有非叶子结点至多拥有两个儿子（Left和Right）；</li>
<li>所有结点存储一个关键字；</li>
<li> 非叶子结点的左指针指向小于其关键字的子树，右指针指向大于其关键字的子树；</li>
</ul>
<div class="wp-caption aligncenter" style="width: 257px"><img title="Btree" src="http://www.cppblog.com/images/cppblog_com/emptysoul/1.JPG" alt="Btree" width="247" height="252" /><p class="wp-caption-text">Btree</p></div>
<blockquote><p>       B树的搜索，从根结点开始，如果查询的关键字与结点的关键字相等，那么就命中；否则，如果查询关键字比结点关键字小，就进入左儿子；如果比结点关键字大，就进入右儿子；如果左儿子或右儿子的指针为空，则报告找不到相应的关键字；</p>
<p>       如果B树的所有非叶子结点的左右子树的结点数目均保持差不多（平衡），那么B树的搜索性能逼近二分查找；但它比连续内存空间的二分查找的优点是，改变B树结构（插入与删除结点）不需要移动大段的内存数据，甚至通常是常数开销； </p>
<p>   但B树在经过多次插入与删除后，有可能导致不同的结构：</p></blockquote>
<div class="wp-caption aligncenter" style="width: 495px"><img alt="Btree1" src="http://www.cppblog.com/images/cppblog_com/emptysoul/31.jpg" title="Btree1" width="485" height="248" /><p class="wp-caption-text">Btree1</p></div>
<blockquote><p>   右边也是一个B树，但它的搜索性能已经是线性的了；同样的关键字集合有可能导致不同的树结构索引；所以，使用B树还要考虑尽可能让B树保持左图的结构，和避免右图的结构，也就是所谓的“平衡”问题；      </p>
<p>       实际使用的B树都是在原B树的基础上加上平衡算法，即“平衡二叉树”；如何保持B树结点分布均匀的平衡算法是平衡二叉树的关键；平衡算法是一种在B树中插入和删除结点的策略；</p></blockquote>
<p><strong>B-树</strong></p>
<blockquote><p>       是一种多路搜索树（并不是二叉的）：</p></blockquote>
<ul>
<li>定义任意非叶子结点最多只有M个儿子；且M>2；</li>
<li>根结点的儿子数为[2, M]；</li>
<li>除根结点以外的非叶子结点的儿子数为[M/2, M]；</li>
<li>每个结点存放至少M/2-1（取上整）和至多M-1个关键字；（至少2个关键字）</li>
<li>非叶子结点的关键字个数=指向儿子的指针个数-1；</li>
<li>非叶子结点的关键字：K[1], K[2], …, K[M-1]；且K[i] < K[i+1]；</li>
<li>非叶子结点的指针：P[1], P[2], …, P[M]；其中P[1]指向关键字小于K[1]的子树，P[M]指向关键字大于K[M-1]的子树，其它P[i]指向关键字属于(K[i-1], K[i])的子树；</li>
<li>所有叶子结点位于同一层；</li>
</ul>
<blockquote><p>       如：（M=3）<br />
<div class="wp-caption aligncenter" style="width: 634px"><img alt="b-" src="http://www.cppblog.com/images/cppblog_com/emptysoul/b-.JPG" title="b-" width="624" height="268" /><p class="wp-caption-text">b-</p></div>
</p></blockquote>
<blockquote><p> B-树的搜索，从根结点开始，对结点内的关键字（有序）序列进行二分查找，如果命中则结束，否则进入查询关键字所属范围的儿子结点；重复，直到所对应的儿子指针为空，或已经是叶子结点；</p>
<p>B-树的特性：</p></blockquote>
<ul>
<li>关键字集合分布在整颗树中；</li>
<li> 任何一个关键字出现且只出现在一个结点中；</li>
<li>搜索有可能在非叶子结点结束；</li>
<li>其搜索性能等价于在关键字全集内做一次二分查找；</li>
<li>自动层次控制；</li>
</ul>
<blockquote><p>       由于限制了除根结点以外的非叶子结点，至少含有M/2个儿子，确保了结点的至少利用率，其最底搜索性能为：
</p></blockquote>
<div class="wp-caption aligncenter" style="width: 338px"><img alt="O(lgN)" src="http://www.cppblog.com/images/cppblog_com/emptysoul/B-1.JPG" title="math_formulation" width="328" height="256" /><p class="wp-caption-text">O(lgN)</p></div>
<blockquote><p>       其中，M为设定的非叶子结点最多子树个数，N为关键字总数；</p>
<p>       所以B-树的性能总是等价于二分查找（与M值无关），也就没有B树平衡的问题；</p>
<p>       由于M/2的限制，在插入结点时，如果结点已满，需要将结点分裂为两个各占M/2的结点；删除结点时，需将两个不足M/2的兄弟结点合并；</p></blockquote>
<p><strong>B+树</strong></p>
<blockquote><p>       B+树是B-树的变体，也是一种多路搜索树：</p></blockquote>
<ul>
<li>其定义基本与B-树同;
</li>
<li>非叶子结点的子树指针与关键字个数相同；</li>
<li>非叶子结点的子树指针P[i]，指向关键字值属于[K[i], K[i+1])的子树（B-树是开区间）；</li>
<li>为所有叶子结点增加一个链指针；</li>
<li> 所有关键字都在叶子结点出现；</li>
</ul>
<blockquote><p>       如：（M=3）</p></blockquote>
<div class="wp-caption aligncenter" style="width: 579px"><img alt="B+tree" src="http://www.cppblog.com/images/cppblog_com/emptysoul/b7.JPG" title="Bplus" width="569" height="345" /><p class="wp-caption-text">B+tree</p></div>
<blockquote><p>   B+的搜索与B-树也基本相同，区别是B+树只有达到叶子结点才命中（B-树可以在非叶子结点命中），其性能也等价于在关键字全集做一次二分查找；</p>
<p>       B+的特性：</p></blockquote>
<ul>
<li> 所有关键字都出现在叶子结点的链表中（稠密索引），且链表中的关键字恰好是有序的；</li>
<li>不可能在非叶子结点命中；</li>
<li>非叶子结点相当于是叶子结点的索引（稀疏索引），叶子结点相当于是存储（关键字）数据的数据层；</li>
<li>更适合文件索引系统；</li>
</ul>
<p><strong>B*树</strong></p>
<blockquote><p>是B+树的变体，在B+树的非根和非叶子结点再增加指向兄弟的指针:</p></blockquote>
<div class="wp-caption aligncenter" style="width: 579px"><img alt="B*" src="http://www.cppblog.com/images/cppblog_com/emptysoul/B8.JPG" title="bstar" width="569" height="345" /><p class="wp-caption-text">B*</p></div>
<blockquote><p>  B*树定义了非叶子结点关键字个数至少为(2/3)*M，即块的最低使用率为2/3（代替B+树的1/2）；</p>
<p>       B+树的分裂：当一个结点满时，分配一个新的结点，并将原结点中1/2的数据复制到新结点，最后在父结点中增加新结点的指针；B+树的分裂只影响原结点和父结点，而不会影响兄弟结点，所以它不需要指向兄弟的指针；</p>
<p>       B*树的分裂：当一个结点满时，如果它的下一个兄弟结点未满，那么将一部分数据移到兄弟结点中，再在原结点插入关键字，最后修改父结点中兄弟结点的关键字（因为兄弟结点的关键字范围改变了）；如果兄弟也满了，则在原结点与兄弟结点之间增加新结点，并各复制1/3的数据到新结点，最后在父结点增加新结点的指针；</p>
<p>       所以，B*树分配新结点的概率比B+树要低，空间使用率更高；</p></blockquote>
<p><strong>小结</strong></p>
<blockquote><p>       B树：二叉树，每个结点只存储一个关键字，等于则命中，小于走左结点，大于走右结点；</p>
<p>       B-树：多路搜索树，每个结点存储M/2到M个关键字，非叶子结点存储指向关键字范围的子结点；</p>
<p>       所有关键字在整颗树中出现，且只出现一次，非叶子结点可以命中；</p>
<p>       B+树：在B-树基础上，为叶子结点增加链表指针，所有关键字都在叶子结点中出现，非叶子结点作为叶子结点的索引；B+树总是到叶子结点才命中；</p>
<p>       B*树：在B+树基础上，为非叶子结点也增加链表指针，将结点的最低利用率从1/2提高到2/3。</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.dutor.net/index.php/2009/05/tree-b-b-b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

