您的位置:首页 > 其它

创建二叉树

2010-11-16 10:21 183 查看
今天看到了一个数据结构的笔试题目,他要求写出创建二叉树的程序。我想练习练习,所以想了一下其大致的思路,记录如下:

题目的要求很简单,给出一个字符串序列:比如说A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I))),然后要求按照其规则创建二叉树,题目不难但是却花费了我不少的时间~

第一步,我想到的是需要什么样的数据结构。二叉树肯定有典型的结构可用了。关键是用什么样的数据结构把A 和B,C之间的父子关系表达出。而A和B,C不是在一起的。中间的部分有点对称性,‘(’与‘)’的对称,如何消除这部分呢,想到了用栈。

第二步,就是考虑栈需要什么样的存储规则来表示这个二叉树呢? 我的想法是先从最常规的开始,慢慢的匹配,逐渐地修正其规则 常规的想法是按顺序一个一个地存放,要用的存储,不要用的删掉。

按照这个思路,我先试一下,有两个问题:首先可以肯定的是'('没有用,不需要存储,但是想B,D,E,H之类的是有时候有用,有时候没有用。怎么判断什么时候有用什么时候没有用 还有就是如何表述左右节点的关系:A(B(D,E)显然B是A的左节点,D是B的左节点,E是B的右节点。

首先解决第一个问题:什么时候有用,B,D,E之类的用途无非是用来当做父节点,如果其有子节点的话,可以找到它。所以如果其没有子节点的话,我们根本不必存储。怎么判定呢?分析就知道,其后如果是'('的话,说明有子节点

其次是左右子节点的问题:显然跟在‘(’后面的是左节点,跟在‘,’后面的是右节点。

综合上面的分析我们得出创建二叉树的思路如下:

扫描字符串,从头开始:

如果是字符串而且其后是‘(’,那么存储在栈里,创建节点存储起来,如果其前是‘(’则把其当做栈中字符的左节点,如果其前事‘,’那把其当做当前栈的右节点 如果是‘(’,则忽略,如果是‘,’忽略,如果是‘)’那么从栈里弹出节点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: