数据结构学习笔记(9)---已知二叉树的遍历序列,恢复二叉树

来源:互联网 发布:怎样在电脑上开淘宝店 编辑:程序博客网 时间:2024/05/16 11:07
思路:首先我们要了解如何使用二叉树中序序列和先序序列来手动恢复二叉树
  • (1)根据先序序列的第一个节点可得到根节点
  • (2)根据根节点在中序序列中的位置可以将中序序列划分为左右子树
  • (3)根据先序的第二个节点可以将子树划分为左右子树,依次循环下去
  • (4)直到当子树的长度为零时结束
//给先序和中序创建二叉树char *PreArray = "abdfgceh"; //先序序列char InArray[] = "bfdgaceh";//中序序列void PreInCreateTree(BiTree &root,int PreIndex,int InIndex,int subTreeLen){    if(subTreeLen <= 0)    {        root = NULL;        return;    }    else    {        root = (BiTree)malloc(sizeof(BiTNode));        //创建先序对应的根节点        root->data = PreArray[PreIndex];        //找到该节点在中序序列中的位置,并将中序序列划分为左右两个子树        //strchr(InArray,PreArray[PreIndex])返回的是该节点在中序序列中的地址        int index = strchr(InArray,PreArray[PreIndex]) - InArray;        //左子树的长度        int LenL = index - InIndex;        //创建左子树        PreInCreateTree(root->LChild,PreIndex+1,InIndex,LenL);        //右子树的长度 = 总长度 - 左子树长度 - 一个根节点        int LenR = subTreeLen - LenL - 1;        //创建右子树,先序的字符位置从左子树和根节点后面开始,中序的位置从当前根节点后面的一个位置开始        PreInCreateTree(root->RChild,PreIndex+LenL+1,index+1,LenR);    }}
(2)根据后序与中序恢复二叉树 思路为:
  • (1)根据后序序列的倒数第一个节点可得到根节点
  • (2)根据根节点在中序序列中的位置可以将中序序列划分为左右子树
  • (3)根据后序的倒数第二个节点可以将子树划分为左右子树,依次循环下去
  • (4)直到当子树的长度为零时结束
char *PostArray = "fgdbheca"; //后序序列char InArray[] = "bfdgaceh";//中序序列void PostInCreateTree(PBiTree &root, int PostIndex, int InIndex, int subTreeLen){    if (subTreeLen <= 0)    {        root = NULL;        return;    }    else    {        root = new BiTree;        root->date = PostArray[PostIndex];        int index = strchr(InArray, PostArray[PostIndex]) - InArray;        int LenL = index - InIndex;        int LenR = subTreeLen - LenL - 1;        PostInCreateTree(root->rchild, PostIndex - 1, index + 1, LenR);        PostInCreateTree(root->lchild, PostIndex - LenR -1, InIndex, LenL);    }}
阅读全文
0 0
原创粉丝点击