最近学习算法,看CSDN博客:结构之法 中的 微软100题。由于编程动手少,知道怎么做,但是就是写不出代码来,所以把答案抄写几遍,最后记住了答案,可以直接写出代码来。那么是不是多记忆一些代码然后就可以提高自己的编程能力呢?我想这就如同背记作文,然后背多了就能写出文章来,但是这样的效率高吗?恐怕不会很高,写代码毕竟不是写作文,如果碰到了另一个问题,之中有细微的差别,那么背记的代码就不是那么好用了,而且只靠记忆很难保证不遗忘,如果遇到问题就要查找之前的代码,那编程的效率必定下降。那么该如何去编程呢?
答案一定是用自己的思考过程来编程,如同数学物理解题一样。把自己的想法实现出来才是最省力也是最高效的方法,那么伪代码的作用就在于此了,可以直接在gedit(linux下的文本编辑器)中输入伪代码来整理自己的思路,如下所示:
二叉树的节点和双向链表的节点构造类似
struct Node
{
int value;
Node *left;
Node *right;
};
那么把一个二叉树的节点转换成为一个双向链表的节点就可以这样思考:
首先要构造一个双向链表,需要一个指向链表头部的指针Node *phead;
另一方面,要向链表中插入节点,需要有一个对链表中节点的索引Node *index;
(当然在全局作用域中指针会默认初始化成NULL,但是在局部作用域中不会对指针初始化)
接着我们要插入第一个节点,那么就可以如下写伪代码:
pindex = NULL
pcurrent->left = NULL; 可简化成pcurrent->left = pindex;与插入第二个节点时相同。
phead = pcurrent;
pindex = pcurrent;
然后插入第二个节点:
pcurrent->left = pindex;
pindex->right = pcurrent;
pindex = pcurrent;
那么接下来可以简化我们的程序,红色部分的代码相同,黄色部分的代码也相同,故代码简化成:
pcurrent->left = pindex;
if(NULL == pcurrent)
phead = pcurrent;
else
pindex->right = pcurrent;
pindex = pcurrent;
在记事本中编辑可以随意写伪代码,也就可以自由的组织自己的思想。
附题:
把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ /
6 14
/ / / /
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
阅读(4858) | 评论(0) | 转发(0) |