创建二叉树
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之类的用途无非是用来当做父节点,如果其有子节点的话,可以找到它。所以如果其没有子节点的话,我们根本不必存储。怎么判定呢?分析就知道,其后如果是'('的话,说明有子节点
其次是左右子节点的问题:显然跟在‘(’后面的是左节点,跟在‘,’后面的是右节点。
综合上面的分析我们得出创建二叉树的思路如下:
扫描字符串,从头开始:
如果是字符串而且其后是‘(’,那么存储在栈里,创建节点存储起来,如果其前是‘(’则把其当做栈中字符的左节点,如果其前事‘,’那把其当做当前栈的右节点 如果是‘(’,则忽略,如果是‘,’忽略,如果是‘)’那么从栈里弹出节点。
题目的要求很简单,给出一个字符串序列:比如说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之类的用途无非是用来当做父节点,如果其有子节点的话,可以找到它。所以如果其没有子节点的话,我们根本不必存储。怎么判定呢?分析就知道,其后如果是'('的话,说明有子节点
其次是左右子节点的问题:显然跟在‘(’后面的是左节点,跟在‘,’后面的是右节点。
综合上面的分析我们得出创建二叉树的思路如下:
扫描字符串,从头开始:
如果是字符串而且其后是‘(’,那么存储在栈里,创建节点存储起来,如果其前是‘(’则把其当做栈中字符的左节点,如果其前事‘,’那把其当做当前栈的右节点 如果是‘(’,则忽略,如果是‘,’忽略,如果是‘)’那么从栈里弹出节点。
相关文章推荐
- 创建最小高度二叉树
- 堆算法(二叉树创建、遍历)
- 二叉树的创建、前序遍历、中序遍历、后序遍历
- PHP 创建二叉树镜像(交换左右子树)
- 二叉树的先序递归创建和遍历
- java 二叉树/创建/先序/中序/后序
- C语言实现二叉树的基本操作---创建、遍历、求深度、求叶子结点
- 二叉树的创建和操作
- C++创建二叉树与遍历(递归与迭代)
- 二叉树的创建及遍历
- 二叉树的创建和前序遍历
- 创建一个二叉树,对该树线索化,对该树线索化遍历
- C语言二叉树的创建
- 由前序遍历序列跟中序遍历序列生成二叉树,如果输入序列不正确返回fail~ 如果正确则前序遍历创建的二叉树
- n个节点总共能创建几种不同的二叉树
- 二叉树的创建、前序遍历、中序遍历、后序遍历
- Leetcode 606. 根据二叉树创建字符串
- ::递归实现——创建二叉树 ----> 装入数据--->遍历---> 显示 --->销毁
- #法(先序遍历)创建二叉树
- 二叉树的创建,遍历,叶节点数,总结点数,深度