前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >序列中查找第二小元素

序列中查找第二小元素

作者头像
chain
发布2018-08-02 14:51:12
5560
发布2018-08-02 14:51:12
举报

序列中查找第二小元素有很多方法,本文介绍的是采用分治的思想,自底向上,序列中两两构成一对,比较选出最小值,然后构成上一层序列,然后依次网上构造,最后,根节点就是最小值,但是我们这里要找的是次小值,由于,次小值肯定和最小值比较过了,因此我们只需要沿着最小值的分支,往下遍历,然后肯定能够找到最小值。

我们看一下这个图:

我们很清楚的能够看出这个树的构造。

算法思路很清晰,下面贴出源代码,供大家参考:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>


typedef struct node {
	struct node *left;
	struct node *right;
	struct node *next;
	struct node *parent;
	int key;
}node;

int find(node *head)
{
	node **curr,*ptr,*q,*t;
	
	//一层只有一个元素时表示root
	while(head->next) {
		
		//q指向每一层第一个节点
		//ptr移动地指向每两两节点的第一个
		q=ptr=head;
		curr=&t;
		while(ptr) {
			(*curr)=(node *)malloc(sizeof(*q));
			(*curr)->next=NULL;
			//数组为奇数个
			if(ptr->next==NULL) {
				(*curr)->key=ptr->key;
				(*curr)->left=(*curr)->right=ptr;
				ptr->parent=*curr;
				break;
			}
			else {
				int fir=ptr->key;
				int sec=ptr->next->key;
				(*curr)->key=(fir>sec?sec:fir);
				(*curr)->left=ptr;
				(*curr)->right=ptr->next;
				ptr->parent=ptr->next->parent=*curr;
			}
			curr=&((*curr)->next);
			ptr=ptr->next->next;
		}
		//向上移动一层
		head=q->parent;
	}

	int min=head->key,min2=0x7fffffff;
	//从根节点往下找,从最小值的那个分支找次小值
	while(head->left) {
		int lval=head->left->key;
		int rval=head->right->key;
		if(lval==min) {
			min2=rval>min2?min2:rval;
			head=head->left;
		}else {
			min2=lval>min2?min2:lval;
			head=head->right;
		}
	}
	return min2;
}


int main()
{
	int a[7]={3,1,7,5,9,0,6};
	//双重指针用来存放新分配节点的地址
	//这样就不用再判断是不是首节点了
	node *curr,**ptr=&curr;
	
	for(int i=0;i<7;i++) {
		*ptr=(node *)malloc(sizeof(*curr));
		(*ptr)->left=(*ptr)->right=(*ptr)->parent=NULL;
		(*ptr)->key=a[i];
		ptr=&((*ptr)->next);
	}
	*ptr=NULL;

	printf("%d\n",find(curr));
	//没有释放内存
}

这里用到了一个小技巧就是使用双重指针来代替对空链表的检查,具体的用法大家可以参考《C语言接口与实现》这本书。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014年09月27日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档