递归之递归的数据结构

说到递归的题目,一般自然就会想到阶乘、斐波那契以及谭老师的汉诺塔;那说到递归的数据结构呢,当然是树结构了。

可以说树天生是合适进行递归的,教科书中一般都会介绍下面的三个遍历,当然有递归做法和非递归做法,一般还是使用递归来做。那就是前序、中序和后序遍历。这里一般是二叉树。

 1 void preorder(treenode *root)
 2 {
 3     if(root!=NULL)
 4     {
 5         cout<<root->data<<endl;
 6         preorder(root->left);
 7         preorder(root->right);
 8     }
 9 }

其他就不写了,只是将if中的顺序进行一些变换。

另外还有题目就是,给出树的前序,中序,后序中的一些,要求将树写出来。

二叉树或者完全二叉树还有一些性质,比如树的高度,树中叶子节点的数目等等。一般与它们有关系的代码,其时间复杂度都和O(lgN)相关,也就是和树的高度有关。

所以,要将树的高度变得最小,就涉及到了平衡二叉树,基本上熟悉的有AVL和红黑树,在STL中实现的版本就是红黑树。 红黑树的统计性能要高于AVL树。

一般的DFS和BFS,也就是深度优先搜索和广度优先搜索,主要对的解空间也就是对着树。DFS也就是进行递归和回溯,其中利用剪枝等技巧去掉很多不必要的解来加快算法速度。BFS还另外利用一个数据结构来辅助存储该层的节点,来达到广度优先搜索。

 

posted on 2009-11-03 20:40  cnyao  阅读(890)  评论(1编辑  收藏  举报