马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册
x
在别的论坛上见有人问这个问题,想了一下,在这里发一下自己的见解。
写一个程序,用来存贮二叉树并能读出来。
这个问题包括三点:二叉树的遍历,建立以及存贮。其中存贮是难点,主要考虑什么样的存贮方案。
我能想到的存贮方案有:
1. 最简单的存贮:把各个元素按满树的位置来存贮。这种存贮方法最大问题就是占空间多。
2. 构建存贮链接:每个存贮单元包括:根节点值,左子树位置值,右子树位置值。下面是一个例子:
R1, 1, 6, R2, 2, 5, R4, 3, 4, R8, 0, 0, R9, 0, 0, R5, 0, 0, R3, 7, 9, R6, 0, 8, R10, 0, 0, R7, 10, 0, R11, 0, 0
这种存贮方式使用了额外的两个值来存贮每个节点的左右子树的位置,所以存贮空间为:n * sizeof(R) + 2 * n * sizeof(int)
缺点是存贮算法相对复杂,对于二进制存贮比较好,因为可以随机读写记录。对文本存贮则需要在内存上先算好每棵子树的位置才能写入。
3. 编号存贮:每个子树的根节点按照其满树的位置编号,在写入硬盘时,每个节点记录为:根节点值,位置值。
这种存贮方式比较容易构建(节点编号为根树编号*2 + 0|1),存贮空间也比方法2少很多。比较适合按层遍历。
有时间把代码写上来,没时间就算了。 |