摘要: 程序代码: void BInsertionSort(Elem R[],int n) { for(i = 2;i <= n;i++) if(R[0] < R[i]) { R[0] = R[i]; low = 1; high = i-1; while(low <= high) { mid = (low+high)/2; if(R[0] < R[mid]) high = mid-1; else low =... 阅读全文
posted @ 2012-09-12 20:45 毛毛hhmm 阅读(101) 评论(0) 推荐(0) 编辑
摘要: 程序代码: void InsertionSort(Elem R[],int n) { for(i = 2;i <= n;i++) if(R[i-1] > R[i]) { R[0] = R[i]; for(j = i-1;R[0] < R[j];j--) R[j+1] = R[j]; R[j+1] = R[0]; } }最好情况:记录有序,比较次数为n-1,移动次数为0;最差情况:记录逆序,比较次数2+3+---+n=(n+2)(n-1)/2,移动次数为(2+1)+(3+1)+---+(n+1)... 阅读全文
posted @ 2012-09-12 20:05 毛毛hhmm 阅读(142) 评论(0) 推荐(0) 编辑
摘要: 思路:在二分比较中,如果遇到相等,则: (1).如果当前下标为0,或者key与pdic->element[mid-1].key不等,那么mid一定是key第一次出现的下标,返回mid即可; (2).如果(1)不成立,那么mid一定大于等于key第一次出现的下标,需要在low和mid-1之间继续进行搜索,找出key第一次出现的下标。时间复杂度:O(logn)。程序代码: int binarySearch(SeqDictinoary * pdic,KeyType key,int *position) { int low = 0,high = pdic->n-1,mid; whi... 阅读全文
posted @ 2012-09-12 16:31 毛毛hhmm 阅读(410) 评论(0) 推荐(0) 编辑
摘要: 数据结构: struct BinTreeNode; typedef struct BinTreeNode * pBinTreeNode; struct BinTreeNode { KeyType key; //元素的关键码 DataType othre; //元素的属性 PBinTreeNode llink,rlink; }; //字典的存储 typedef struct BinTreeNode *BinTree; typedef BinTree * PBinTree; //字典的指针检索算法: int searchNode(... 阅读全文
posted @ 2012-09-12 14:41 毛毛hhmm 阅读(289) 评论(0) 推荐(0) 编辑
摘要: 思路:二叉树的先根序列和中根序列,用两个数组preorder和inorder存放,先根序列的第一个元素值preorder[0]应为二叉树的根上的元素值,在另一个数组中查到此值,设为inorder[k]。此时,数组preorder中从preorder[1]到preorder[k]的序列(长度为k)和数组inorder中从inorder[0]到inorder[k-1](长度为k)的序列,恰好分别是根结点左子树的先根序列和中根序列;数组preorder中从preorder[k+1]到preorder[n-1]的序列(长度为n-k-1)和数组inorder中从inorder[k+1]到inorder[ 阅读全文
posted @ 2012-09-10 22:29 毛毛hhmm 阅读(4000) 评论(0) 推荐(0) 编辑
摘要: 思路:用栈的非递归后根遍历二叉树时,遇到结点p时,栈中保存的即为p的所有祖先。利用这一点,在一次遍历中分布找出p和q的所有祖先,再找它们的共同祖先就容易了。时间复杂度:和后根遍历一次二叉树一样,即O(n)。空间复杂度:O(h),h为二叉树的高度。数据结构: struct BinTreeNode; typedef struct BinTreeNode * PBinTreeNode; struct BinTreeNode { char info; PBinTreeNode llink; PBinTreeNode rlink; }; typedef struct Bin... 阅读全文
posted @ 2012-09-10 22:13 毛毛hhmm 阅读(5426) 评论(2) 推荐(0) 编辑
摘要: 思路:按根、左子树、右子树(先根)的顺序遍历给定二叉树,同时,按根、右子树、左子树的顺序创建一棵新的二叉树。时间复杂度;O(n)。空间复杂度:O(h)。程序代码: BinTree create_mirror(BinTree t) { BinTree mirror; if(t == NULL) return NULL; mirror = (BinTree)malloc(sizeof(struct BinTreeNode)); mirror->info = t->info; mirror->rlink = create_mirror(t->llink);... 阅读全文
posted @ 2012-09-10 21:26 毛毛hhmm 阅读(268) 评论(0) 推荐(0) 编辑
摘要: 1.程序代码(高度): int depth(BinTree t) { if(t == NULL) return 0; int dl = depth(t->llink); int dr = depth(t->rlink); return (dl>dr ? dl : dr)+1; }2.程序代码(结点数): int num_of_nodes(BinTree t) { if(t == NULL) return 0; return 1+num_of_nodes(t->llink)+num_of_nodes(t->rlink); }3.... 阅读全文
posted @ 2012-09-10 21:21 毛毛hhmm 阅读(8721) 评论(0) 推荐(1) 编辑
摘要: 1.递归算法: void PreOrder(BNode p) { if(p == NULL) return; PreOrder(p->lchild); PreOrder(p->rchild); visit(p); }2.非递归算法: 程序代码: struct Elem { BNode ptr; int tag; }; void nPostOrder(BTree btree) { stack s; Elem s_node; BNode p; if(btree ==... 阅读全文
posted @ 2012-09-10 21:14 毛毛hhmm 阅读(305) 评论(0) 推荐(0) 编辑
摘要: 1.递归算法: void PreOrder(BNode p) { if(p == NULL) return; PreOrder(p->lchild); visit(p); PreOrder(p->rchild); }2.非递归算法: 思路:从二叉树的根结点,令变量c为根结点。若c不为空时,则令c沿其左子女结点前进,在前进过程中,把所经历的结点逐个压入栈中,当c为空时,弹出栈顶元素送给c,并访问该结点,再令c为当前结点的右子女结点。重复上述过程,当c为空并且栈也为空时,遍历结束。 程序代码: void nInOrder(BNode btree)... 阅读全文
posted @ 2012-09-10 20:44 毛毛hhmm 阅读(425) 评论(0) 推荐(0) 编辑