1.链表逆置
void reverse()
{
Node* scan=head->next;
head->next=nullptr;
while(scan)
{
Node* n=scan->next;
scan->next=head->next;
head->next=scan;
scan=n;
}
}
2.链表排序
void SelectSort()
{
for(int i=0;inext;
Node *beformaxnode=head;
for(int j=0;jnext;
scan=scan->next;
}
Node *maxnode=scan;
while(scan->next!=nullptr)
{
// cout<<"item:"<item<next->item > maxnode->item)
{
beformaxnode=scan;
maxnode=scan->next;
}
scan=scan->next;
}
beformaxnode->next=maxnode->next;
maxnode->next=head->next;
head->next=maxnode;
}
}
3.二叉树层次遍历分层
进行一个简短的说明,显然,每一层的访问都是在上一层结束之后才会开始。那么如果我们在每一层访问之前,统计一下当前队列的节点数,就是每一层的数量。
void LevelOrderTraverse()
{
if(root==nullptr) return;
queue nl;
nl.push(root);
while(!nl.empty())
{
int size=nl.size();
for(int i=0;ival<<' ';
if(n->left) nl.push(n->left);
if(n->right) nl.push(n->right);
}
cout<
4.判断是否完全二叉树
bool IsCompleted()
{
Node *scan;
queue q;
bool n1=false;
q.push(root);
while(!q.empty())
{
scan=q.front();
q.pop();
if(scan->left==nullptr&&scan->right==nullptr)
{
n1=true;//出现叶结点就不能再出现只有左儿子的情况了
}
else if(!scan->left&&scan->right)
{
return false;
}
else if(scan->left&&!scan->right)
{
if(n1)
return false;
else{
n1=true;
q.push(scan->left);
}
}
else//有两个儿子
{
if(n1)
{
return false;
}
q.push(scan->left);
q.push(scan->right);
}
}
return true;
}
5.霍夫曼编码
核心函数是建立和编码
struct Node{
int weight;
int parent;
int lchild;
int rchild;
Node():weight(0),parent(0),lchild(0),rchild(0){};
Node(int x):weight(x),parent(0),lchild(0),rchild(0){};
};
class Haffmantree
{
public:
Haffmantree(){};
void inputData(int num)
{
n=num;
ans=new Node[2*n];
int x;
for(int i=1;i>x;
ans[i].weight=x;
}
ans[0].weight=0xfffffff;
}
void select2min(int pos,int&s1,int&s2)
{
s1=0;
s2=0;
for(int i=1;ians[s1].weight&&ans[i].weight
6.快速排序
书上快排写得不便于背诵,给一个好背一点的。
void quickSort(vector &a,int left,int right)
{
if(left>right) return;
int pivot = a[left];
int i=left,j=right;
for(;;)
{
while(a[i]=pivot) j--;
if(i &a)
{
quickSort(a,0,a.size()-1);
}
7.堆排序
//约定len为不可访问的第一个下标
void HeapModify(vector &a,int i,int len)
{
int p=i;
int son = p*2+1;
int tmp = a[i];
while(son &a)
{
for(int i = (a.size())/2;i>=0;i--)
{
HeapModify(a,i,a.size());
}
for(int i=a.size()-1;i>=0;i--)
{
swap(a[0],a[i]);
HeapModify(a,0,i);
}
}