重建树结构

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

#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;
}

运行结果:

时间: 2024-08-25 11:01:42

重建树结构的相关文章

[树结构]二叉树的重建和序列化

二叉树的重建 几乎所有的人都知道二叉树可以根据前序遍历+中序遍历或者后序遍历+中序遍历的方式重新建立原来的二叉树,并且结果是唯一的.下面就来看一下相关的方法. 前序+中序重建二叉树 给定一棵二叉树的前序和中序遍历序列,重新建立这棵二叉树. 注意:在前序中确定了根节点以后,要去中序里面查找这个根节点,这时的查找没必要从数组的0下面开始,从这个树的中序的第一个点开始.然后查找的个数为停止的下表减去中序开始的下表. 这里重建二叉树用的是递归的方法,要注意递归的出口.不然会死循环. 所以代码实现: Tr

《剑指offer》— JavaScript(4)重建二叉树

重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 实现代码 function reConstructBinaryTree(pre, vin) { if(!pre || pre.length===0){ return; } var root={ val:pre[0] }; for(var i

bzoj 2957: 楼房重建.

2957: 楼房重建 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2303  Solved: 1088[Submit][Status][Discuss] Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个二维平面上.小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和

TestDisk 数据恢复 重建分区表恢复文件-恢复diskpart clean

source:http://www.cgsecurity.org/wiki/TestDisk_CN TestDisk 是一款开源软件,受GNU General Public License (GPL v2+)条款保护. TestDisk:http://www.cgsecurity.org/wiki/TestDisk_CN TestDisk 是一款强大 的免费数据恢复软件! 早期主要是设计用来在使用有缺陷的软件,病毒或人为误操作(如不小心删除分区表)导致的分区丢失后,帮助用户恢复丢失分区,或修复不

Windows10 图标重建

有没有遇到电脑上某个图标成了黑块,白块或者没有图呢. 那这样的话就可以使用图标重建啦. 删掉Windows10的图标文件如下图 路径: %userprofile%\AppData\Local\Microsoft\Windows\Explorer 复制好粘贴到我的电脑地址栏. 或者将一下代码复制做成.bat文件右击以管理员方式运行就好. cd /d %userprofile%\AppData\Local\Microsoft\Windows\Explorer taskkill /f /im expl

通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的?

在<中篇>中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.总的来说,管道由一个服务器和一个HttpApplication构成,前者负责监听请求并将接收的请求传递给给HttpApplication对象处理,后者则将请求处理任务委托给注册的中间件来完成.中间件的注册是通过ApplicationBuilder对象来完成的,所以我们先来了解一下这究竟是个怎样的对象.[本文已经同步到<ASP.NET Core框架揭秘>之中] [

第3章 结构之法——重建二叉树

重建二叉树 问题描述 分析与解法 用java实现的代码如下: 1 package chapter3jiegouzhifa.RebuildBinTree; 2 3 /** 4 * 重建二叉树 5 * 递归解法 6 * @author DELL 7 * 8 */ 9 public class RebuildBinTree { 10 //定义节点类 11 public static class Node{ 12 int left; //左子树位置 13 int right; //右子树位置 14 ch

重建二叉树

题目:输入某二叉树的前序遍历黑夜中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历中都不包含重复的数字.例如输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历 {4, 7, 2, 1, 5, 3, 8, 6},则重建出该二叉树. C#实现: public class BinaryTreeNode     {         int value;         BinaryTreeNode left;         BinaryTreeNode right;

bzoj1758 [Wc2010]重建计划

Description Input 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai,Bi,Vi分别表示道路(Ai,Bi),其价值为Vi 其中城市由1..N进行标号 Output 输出最大平均估值,保留三位小数 Sample Input 4 2 3 1 2 1 1 3 2 1 4 3 Sample Output 2.500 HINT N<=100000,1<=L