判断时的技巧
- 判断两个小数a和b是否相等,由于计算机表示小数都有误差,所以不要用
a==b
,应该判断两者之差的绝对值fabs(a-b)<1e-9
,即是否小于一个阈值。 - 判断一个整数是否是为奇数,不要用
x % 2 == 1
,应该用x % 2 != 0
,因为 x 可能是负数。
STL使用技巧
- 优先使用 vector 和 string 而非动态分配的数组,声明多维数组的方法:
vector<vector<int> > ary(row_num, vector<int>(col_num, 0));
随机问题
有时候会遇到要求“随机选择”、“求xx的概率”之类的题目,对此正确的做法是“累加求平均”,这样就能得到xx的平均概率,然后题目就能变得很简单了。
二叉树中指针和引用的区别
创建二叉树
有两类模式:
a: 在main 函数中定义一个TreeNode *
,注意这是个二叉树节点的指针类型。然后将这个参数传递给一个CreatBiTree函数;在该函数中递归创建二叉树;代码如下:
void CreatBiTree( TreeNode ** T) //注意我这里用的是二级指针
{
char ch;
ch=getchar();
if( ch == '*') //如果输入星号则二叉树的节点为空节点
*T=NULL;
else{
(*T) = new TreeNode(ch);
CreatBiTree(&((*T)->lchild)); //分配成功则接着建立左子树和右子树
CreatBiTree(&((*T)->rchild));
}
}
这里用到了树节点的二级指针,其实也可以用树节点的指针的引用,如下:
void CreatBiTree( TreeNode *& T) //注意我这里用的是指针的引用
{
char ch;
ch=getchar();
if( ch == '*') //如果输入星号则二叉树的节点为空节点
T=NULL;
else{
T = new TreeNode(ch);
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
注意,之所以不能使用树节点指针作为形参,是因为在建树的过程中,我们不是改变了树节点,而是: 改变了树节点指针的指向。
如果使用树节点指针作为形参,那么我们实际上是对该指针的拷贝进行操作(该拷贝和原指针指向同一个树节点),而原来的指针没有发生变化。这样一来,不仅会造成拷贝后的指针变成野指针,而且也达不到建树的效果。
b:可以直接在CreatBiTree函数中创建二叉树,并返回二叉树的根指针;
如:
TreeNode * root = CreatBiTree();
代码如下:
BiTree CreatBiTree()
{
char ch;
TreeNode * pt=NULL;
ch=getchar();
if( '*'==ch)
return NULL;
pt=new TreeNode(ch);
pt->lchild=CreatBiTree();
pt->rchild=CreatBiTree();
return pt;
}