zoukankan      html  css  js  c++  java
  • 根据先序和中序序列重建二叉树

    #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 ;
    }
  • 相关阅读:
    日志收集
    解决spawn-fcgi child exited with: 1
    confluence启动关闭
    Informatica 启动、停止工作流命令
    启动obiee
    oracle修改连接空闲自动断开
    ORA-00845: MEMORY_TARGET not supported on this system
    svn执行clean up命令时报错
    手游推广
    phonegap/cordova 升级版本
  • 原文地址:https://www.cnblogs.com/crazycodehzp/p/3556863.html
Copyright © 2011-2022 走看看