根据前序遍历和中序遍历构建二叉树

来源:互联网 发布:企业文件管理系统源码 编辑:程序博客网 时间:2024/05/18 01:48

问: 一颗二叉树前序遍历为{1,2,4,7,3,5,6,8},中序遍历为 {4,7,2,1,5,3,8,6},构建这只二叉树。

思路:根节点为1,根据中序遍历左边为4,7,2,右边为5,3,8,6。可以写一个递归函数来搞。

传入参数分别为:前序开始,前序结束,后序开始,后序结束

struct BinaryTreeNode {    int m_value;    BinaryTreeNode* m_pLeftNode;    BinaryTreeNode* m_pRightNode;};BinaryTreeNode* ConstructCore(int* startPrerder, int* endPreorder,int* startInorder,int* endInorder){    //构建根节点    int rootValue = startPrerder[0];    BinaryTreeNode *rootNode = new BinaryTreeNode();    rootNode->m_value = rootValue;    rootNode->m_pLeftNode = NULL;    rootNode->m_pRightNode = NULL;    if(startPrerder == endPreorder)    {        if(startInorder == endInorder && *startPrerder == *startInorder)        {            return rootNode;        }        else        {            throw std::exception("invalid paragram");        }    }    int* rootInorder = startInorder;    //找到根节点在中序的位置    while(*rootInorder != rootValue && rootInorder <= endInorder)    {        rootInorder++;    }    if(rootInorder == endInorder && *rootInorder != rootValue)    {        throw std::exception("invalid paragram");    }    //求出左节点的个数    int leftLength = rootInorder - startInorder;    //求出新的前序遍历末节点位置,递归调用    int* leftPreorderEnd = startPrerder + leftLength;    if(leftLength > 0)    {        rootNode->m_pLeftNode = ConstructCore(startPrerder + 1,leftPreorderEnd, startInorder,rootInorder -1);    if(leftLength < endPreorder - startPrerder)    {        rootNode->m_pRightNode = ConstructCore(leftPreorderEnd + 1,endPreorder,rootInorder+1,endInorder);    }    return rootNode;}
0 0
原创粉丝点击