• 根据先序和中序序列重建二叉树


    #include "stdafx.h"
    #include <iostream>
    #include <exception>
    #include <stack>
    using namespace std;
    
    /*
         重建二叉树
    题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.
         假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如
         输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},
         则重建出图所示的二叉树并输出它的头结点。二叉树结点的定义如下:
    */
    
    struct BinaryTreeNode
    {
        int  m_nValue;
        BinaryTreeNode* m_pLeft;
        BinaryTreeNode* m_PRight;
    };
    
    BinaryTreeNode* ConstructConre(int* startPreorder,int* endPreorder,int* startInorder,int* endInorder)
    {
        int rootValue = startPreorder[0];
        BinaryTreeNode* root = new BinaryTreeNode();
        root->m_nValue = rootValue;
        root->m_pLeft = root->m_PRight = NULL;
        if(startPreorder == endPreorder)
        {
            if(startInorder == endInorder && *startPreorder ==*startInorder)
                return root;
            else
                throw std::exception("invalid input");
        }
        //在中序遍历中找到根结点的值
        int* rootInorder = startInorder;
        while(rootInorder <= endInorder&& *rootInorder !=rootValue)
            ++ rootInorder;
        if(rootInorder ==endInorder && *rootInorder != rootValue)
            throw std::exception("Invalid input.");
        int leftLength = rootInorder - startInorder;
        int *leftPreorderEnd = startPreorder +leftLength;
        if(leftLength >0)
        {
            //构建左子树
            root->m_pLeft = ConstructConre(startPreorder+1,leftPreorderEnd,startInorder,rootInorder -1);
        }
        if(leftLength<endPreorder - startPreorder)
        {
            //构建右子树
            root->m_PRight = ConstructConre(leftPreorderEnd +1,endPreorder,rootInorder+1,endInorder);
        }
        return root;
    }
    
    BinaryTreeNode* Construct(int *preOrder,int* inOrder,int length)
    {
        if(preOrder==NULL||inOrder==NULL||length<=0)
        {
            return NULL;
        }
        return ConstructConre(preOrder,preOrder+length-1,inOrder,inOrder+length-1);
    }
    int _tmain(int argc, _TCHAR* argv[])
    { 
        return 0 ;
    }
  • 相关阅读:
    XNA之3D文字
    SQL2005调用C#编写的DLL
    C#绘图工具之Rotate
    ASP.NET中的WebService
    数据库同步之复制技术
    C#之TCP消息的发送和接受
    Tsql清空表数据的两种方式truncate and delete
    Code First Migrations数据迁移方法
    MSSQLSERVER跨服务器连接
    windows下wget命令行下载工具的使用
  • 原文地址:https://www.cnblogs.com/crazycodehzp/p/3556863.html
Copyright © 2020-2023  润新知