摘要: 分析问题:若一颗二叉树为空,其深度为0,否则,利用其深度等于max{左子树depth,右子树depth}+1,可递归实现:int depth(BiTree T) //树的深度 { if(!T) return 0; int d1 = depth(T -> lchild); int d2 = depth(T -> rchild); return (d1 > d2 ? d1 : d2) + 1; } 阅读全文
posted @ 2013-04-09 18:37 一枚程序员 阅读(288) 评论(0) 推荐(0) 编辑
摘要: 层次遍历用队列实现:方法一:int visit(BiTree T) { if(T) { printf("%c ",T->data); return 1; } else return 0; } void LeverTraverse(BiTree T) //方法一、非递归层次遍历二叉树 { queue <BiTree> Q; BiTree p; p = T; if(visit(p)==1) Q.push(p); whil... 阅读全文
posted @ 2013-04-09 18:32 一枚程序员 阅读(486) 评论(0) 推荐(0) 编辑
摘要: 如下图表示一颗二叉树,对它进行先序遍历操作,采用两种方法,递归和非递归操作。。遍历结果为:4526731。。1、递归操作:思想:若二叉树为空,返回。否则1)后序遍历右子树;2)后序遍历左子树;3)遍历根节点代码:void PostOrder(BiTree root) { if(root==NULL) return ; PostOrder(root->lchild); //递归调用,后序遍历左子树 PostOrder(root->rchild); //递归调用,后序遍历右子树 printf("%c ", root->... 阅读全文
posted @ 2013-04-09 18:18 一枚程序员 阅读(988) 评论(0) 推荐(0) 编辑
摘要: 如下图表示一颗二叉树,对它进行先序遍历操作,采用两种方法,递归和非递归操作。。遍历结果为:4251637。。1、递归操作:思想:若二叉树为空,返回。否则1)中序遍历左子树;2)访问根节点;3)中序遍历右子树代码:void InOrder(BiTree root) { if(root==NULL) return ; InOrder(root->lchild); //递归调用,中序遍历左子树 printf("%c ", root->data); //输出数据 InOrder(root->rchild); //递归调用,中序遍历右子树 }... 阅读全文
posted @ 2013-04-09 18:13 一枚程序员 阅读(1516) 评论(1) 推荐(0) 编辑
摘要: 如下图表示一颗二叉树,对它进行先序遍历操作,采用两种方法,递归和非递归操作。。遍历结果为:1245367。1、递归操作:思想:若二叉树为空,返回。否则1)遍历根节点;2)先序遍历左子树;3)先序遍历右子树代码:void PreOrder(BiTree root) { if(root==NULL) return ; printf("%c ", root->data); //输出数据 PreOrder(root->lchild); //递归调用,先序遍历左子树 PreOrder(root->rchild); //递归调用,先序遍历右子树 ... 阅读全文
posted @ 2013-04-09 18:08 一枚程序员 阅读(23068) 评论(2) 推荐(1) 编辑
摘要: 二叉树数据结构:typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;假设要建立一颗如下的二叉树,输入为:124##5##36##7##我们采用两种方法递归和非递归1、二叉树的先序递归建立过程(递归就是调用栈进行的操作)直接上代码:void CreateBiTree(BiTree &root) { char ch; //要插入的数据 cin>>ch; if(ch=='#') root = NULL; else ... 阅读全文
posted @ 2013-04-09 17:13 一枚程序员 阅读(1257) 评论(0) 推荐(0) 编辑
摘要: 题目是这样描述的:“水王”发帖的数目超过了所有帖子的一半,有各个帖子的作者ID,求这个水王的ID编程之美给出了两种巧妙的解法解法一:ID排序,那么ID列表中的N/2项即为要找的ID(还要排序,时间复杂度为O(NlogN))解法二:通过查找,每次从列表中除去两个不一样的ID,最后就可以得出这个ID,时间复杂度O(N)。写法上也有技巧,不必非要找到一个不一样的在继续下去,如果下一个一样,那么用一个变量记录这个次数,把次数+1,遇见不一样的-1。例如1,1,2,3,4 初始value =1,count =1,第二个1,value = 1,count =2,下一个2,value=1,count=1,下 阅读全文
posted @ 2013-04-02 21:59 一枚程序员 阅读(1996) 评论(2) 推荐(1) 编辑
摘要: 给定整数,判断是否是2的方幂。。我们来做分析:2->10 & 1->01 == 0 4->100 & 3->011 == 0 8->1000 & 7->0111 == 0 16->10000 & 15->01111 == 0是否看到规律呢。。n&(n-1)==0代码:int judge(int n){ return (n>0&&(n&(n-1)==0));} 阅读全文
posted @ 2013-04-02 19:21 一枚程序员 阅读(306) 评论(0) 推荐(0) 编辑
摘要: 解法一:如果n!最末尾位0,则右移一位得到商,如果末尾是1,则不能被2整除,是奇数,这个问题等同与求n!中质有质因数2的个数。。最后结果再加1代码:#include<iostream>using namespace std;int main(){ int n,sum; sum=0; cin>>n; while(n) { n>>=1; sum+=n; } cout<<sum+1<<endl; system("pause"); return 0;}解法二:N减去N的二进制表示中1的数目,然后再加1。。这也是一个规律。. 阅读全文
posted @ 2013-04-02 18:43 一枚程序员 阅读(1647) 评论(0) 推荐(0) 编辑
摘要: 解法一:找出n!中质数2和质数5的个数,由于能被2整除的数的个数比能被5整除的数多的多,因为只需求出质数5的个数。利用Z=[Z/5]+[Z/25]+[Z/125]+....,其中[Z/5]表示<=z的数中含有质数5的个数。。代码:#include<iostream>using namespace std;int main(){ int n,sum; sum=0; cin>>n; while(n) { n/=5; sum+=n; } cout<<sum<<endl; system("pause"); return ... 阅读全文
posted @ 2013-04-02 16:40 一枚程序员 阅读(532) 评论(0) 推荐(0) 编辑