重建树结构

简介:

重建二叉树结构,给定了前序和中序,重建树形结构

复制代码
#include <iostream>
#include <string>
using namespace std;

/*

给定前序,中序,重建树结构
例如假定:
前序:adbcef
中序:dbaecf
后序:dbefca

*/
struct NODE{
    NODE *pLeft;
    NODE *pRight;
    char chValue;
};

//递归构建树
NODE* Rebuild(char *pPreOrderStart,char* pPreOrderEnd,char* pInOrderStart,char *pInOrderEnd)
{
    NODE *root = (NODE*)malloc(sizeof(NODE));
    root->chValue = pPreOrderStart[0];
    root->pLeft = root->pRight = NULL;

    //如果只剩下最后一个节点返回他
    if (pPreOrderStart == pPreOrderEnd && pInOrderStart == pInOrderEnd)
    {
        return root;
    }
    char* rootInOrder = pInOrderStart;
    while(rootInOrder != pInOrderEnd && *rootInOrder != root->chValue)rootInOrder++;
    if(rootInOrder == pInOrderEnd && root->chValue != root->chValue)return NULL;

    int leftLen = rootInOrder - pInOrderStart;
    char* leftPreOrderEnd = pPreOrderStart+leftLen;
    if (leftLen > 0)
    {
        root->pLeft = Rebuild(pPreOrderStart+1,leftPreOrderEnd,pInOrderStart,rootInOrder-1);
    }
    if (leftLen < pPreOrderEnd - pPreOrderStart)
    {
        root->pRight = Rebuild(leftPreOrderEnd+1,pPreOrderEnd,rootInOrder+1,pInOrderEnd);
    }
    return root;
}

//重建树
void RebuildTree(char *pPreOrder,char *pInOrder,int nTreeLen,NODE** pRoot)
{
    if(nTreeLen == 0 || pPreOrder == NULL || pInOrder == NULL)return;
    //构建树
    *pRoot = Rebuild(pPreOrder,pPreOrder+nTreeLen-1,pInOrder,pInOrder+nTreeLen-1);

}

//先根遍历
void preRootView(NODE* root)
{
    cout<<root->chValue;
    if (root->pLeft != NULL )
    {
        preRootView(root->pLeft);
    }
    if (root->pRight != NULL )
    {
        preRootView(root->pRight);
    }
}

//中根遍历
void inRootView(NODE* root)
{
    if (root->pLeft != NULL )
    {
        inRootView(root->pLeft);
    }
    cout<<root->chValue;
    if (root->pRight != NULL )
    {
        inRootView(root->pRight);
    }
}

//后根遍历
void afRootView(NODE* root)
{
    if (root->pLeft != NULL )
    {
        afRootView(root->pLeft);
    }
    if (root->pRight != NULL )
    {
        afRootView(root->pRight);
    }
    cout<<root->chValue;

}



int main(int argc, char **argv)
{
    char *preOrder = "abdcef";
    char *inOrder = "dbaecf";

    NODE *pRoot = (NODE*)malloc(sizeof(NODE));
    int len = strlen(preOrder);
    pRoot->chValue = *preOrder;
    RebuildTree(preOrder,inOrder,len,&pRoot);

    cout<<"先根遍历:";
    preRootView(pRoot);
    cout<<endl;
    cout<<"中根遍历:";
    inRootView(pRoot);
    cout<<endl;

    cout<<"后根遍历:";
        afRootView(pRoot);
    cout<<endl;

    return 0;
}
复制代码

运行结果:

 













本文转自NewPanderKing51CTO博客,原文链接:http://www.cnblogs.com/newpanderking/p/3957195.html ,如需转载请自行联系原作者

相关文章
|
1月前
|
存储 缓存 数据库
数据库索引采用B+树不采用B树的原因?
B+树优化了数据存储和查询效率,数据仅存于叶子节点,便于区间查询和遍历,磁盘读写成本低,查询效率稳定,特别适合数据库索引及范围查询。
39 6
|
2月前
|
存储 缓存 数据库
数据库索引采用B+树不采用B树的原因
B+树相较于B树,在数据存储、磁盘读写、查询效率及范围查询方面更具优势。数据仅存于叶子节点,便于高效遍历和区间查询;内部节点不含数据,提高缓存命中率;查询路径固定,效率稳定;特别适合数据库索引使用。
33 1
|
6月前
|
存储 数据库 索引
什么是B树及其变种B+树?
B+树是B树的一种优化变种,更适合用于数据库和文件系统的索引。
44 0
|
8月前
|
存储
树的存储结构以及树,二叉树,森林之间的转换
树的存储结构以及树,二叉树,森林之间的转换
45 0
|
存储 数据库 索引
为什么索引底层用b+树不用b树
为什么索引底层用b+树不用b树
94 0
篇二:二叉树-创建、重建、
篇二:二叉树-创建、重建、
|
存储 关系型数据库 MySQL
为什么MySQL索引结构采用B+树?
一位6年经验的小伙伴去字节面试的时候被问到这样一个问题,为什么MySQL索引结构要采用B+树?这位小伙伴从来就没有思考过这个问题。只因为现在都这么卷,后面还特意查了很多资料,他也希望听听我的见解。
144 0
|
机器学习/深度学习 算法 前端开发
【戏玩算法】08-树结构
转眼间这个系列已经更新到第八篇了,这篇文章将会介绍一下树,树结构在开发中非常的常见,我们来看一下树这个结构是什么样的,有什么特点。
104 0
【戏玩算法】08-树结构
|
存储 编解码 算法
第 11 章:树结构实际应用(一)
第 11 章:树结构实际应用
97 0
第 11 章:树结构实际应用(二)
第 11 章:树结构实际应用
78 0