说到二叉树的创建,我们一般会想到用递归的方法,因为利用递归写的代码看起来很简洁,但是递归的使用也同样存在效率不够高的问题。所以这里我们要说的是如何利用前序遍历序列和中序遍历序列非递归的创建二叉树。
思想:利用两个栈实现(当然也可以用一个栈,这里针对自己的数据类型设计),一个栈s用来存放树的各个结点,另一个栈isindex用来存放第一个栈中元素对应于中序序列中的下标。首先,我们先将根结点(即前序序列中的第一个元素)及其在中序序列中相应的下标分别入栈s和isindex,并将根结点置于当前结点。然后,从前序序列中首元素开始,依次比较相邻两个元素在中序序列中对应的下标,来确定后一个元素是当前结点的左子树还是右子树,具体有以下几种情况:
1. index2 == -1 这是在中序序列中没找到前序序列中的元素,说明是遍历序列有问题,直接退出
2. index1 > index2 前序序列中后一个元素在中序序列中相对较前的位置,说明后一个元素是当前结点的左子树
3. index1 < index2 前序序列中后一个元素在中序序列中相对较后的位置,说明后一个元素是当前结点的右子树,至于是那棵右子树,还需对index2和栈isindex栈顶元素作循环比较
说到这里就有一个疑问了:为什么index2要和isindex栈顶元素比较呢?首先我们得知道isindex2里面存的是什么,前面已经说过,isindex里面存的是已经创建好的部分树的结点在中序序列中的下标,根据中序遍历的特点:中序遍历左子树,访问根节点,中序遍历右子树,我们知道,中序序列中右结点总是在左结点以及根结点的后边,即右结点在中序序列中的下标
如何利用前序遍历序列和中序遍历序列非递归的创建二叉树
最新推荐文章于 2022-09-26 21:02:07 发布