通过前序(后序)+中序创建树

通过二叉树的前序遍历和中序遍历创建树

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct NODE
{
    int nValue;
    struct NODE* pLeft;
    struct NODE* pRight;
}BinaryTree;

int Getxb(char* inorder,int num)
{
    //得到根在中序遍历中的下标
    for(int i=0;i<strlen(inorder);i++)
    {
        if(inorder[i] == num)
            return i;
    }
    return -1;
}
BinaryTree* CreateNode(char c)
{
    BinaryTree* ptemp = (BinaryTree*)malloc(sizeof(BinaryTree));
    ptemp->nValue = c;
    ptemp->pLeft = NULL;
    ptemp->pRight = NULL;

    return ptemp;
}
BinaryTree* CreateTree(char* pre,char* in)
{
    if(pre == NULL || in == NULL) return NULL;
    if(*pre == NULL) return NULL;
    char szPreorder[100];
    char szInorder[100];
    memset(szPreorder,0,100);
    memset(szInorder,0,100);

    BinaryTree* pNode = CreateNode(pre[0]);

    int index = Getxb(in,pre[0]);
    //index等于几代表根有几个左
    strncpy(szPreorder,pre+1,index);
    strncpy(szInorder,in,index);
    pNode->pLeft = CreateTree(szPreorder,szInorder);

    memset(szPreorder,0,100);
    memset(szInorder,0,100);
    //右的数量等于strlen-左-根(1)
    strncpy(szPreorder,pre+1+index,strlen(pre)-index-1);
    strncpy(szInorder,in+1+index,strlen(pre)-index-1);
    pNode->pRight = CreateTree(szPreorder,szInorder);

    return pNode;

}

void Preorder(BinaryTree* pNode)
{
    if(pNode == NULL) return;
    Preorder(pNode->pLeft);
    Preorder(pNode->pRight);
    printf("%d ",pNode->nValue-48);

}

int main()
{
    char szbuf1[10];
    char szbuf2[10];
    BinaryTree* p = CreateTree("124536","425163");
    Preorder(p);
    return 0;
}

通过二叉树的后序遍历和中序遍历创建树

只有创建树的代码换了

BinaryTree* CreateTree(char* post,char* in)
{
    if(post == NULL || in == NULL) return NULL;
    if(*post == NULL) return NULL;
    //根节点在后序遍历的最后
    int num = strlen(post)-1;
    char szInorder[100];
    char szPostorder[100];
    memset(szInorder,0,100);
    memset(szPostorder,0,100);

    BinaryTree* pTree = CreateNode(post[num]);
    //得到中序遍历中根的下标,index代表根有几个左
    int index = Getxb(in,post[num]);
    strncpy(szInorder,in,index);
    strncpy(szPostorder,post,index);
    pTree->pLeft = CreateTree(szPostorder,szInorder);

    memset(szInorder,0,100);
    memset(szPostorder,0,100);
    //右的数量等于strlen-左-根(1)
    strncpy(szInorder,in+1+index,strlen(in)-1-index);
    strncpy(szPostorder,post+index,strlen(in)-1-index);
    pTree->pRight = CreateTree(szPostorder,szInorder);
    return pTree;
}

原文地址:https://www.cnblogs.com/TheQi/p/9127478.html

时间: 2024-10-10 14:32:58

通过前序(后序)+中序创建树的相关文章

先序+中序和中序+后序建树

思路:先序的第一个元素和后序的最后一个元素是当前子树的根,然后遍历中序序列,找到左右子树的分界线,递归建左子树和右子树. class Solution { public: /*由于是oj,这里假设给的序列是合法的,正常情况是需要判断不合法情况的 */ TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder,int instart,int inend,int poststart,int post

已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法

二叉树中的前序遍历是先访问根结点,再访问左子树,右子树. 中序遍历是先访问左子树,再是根结点,最后是右子树. 后序遍历是先访问左子树,再是右子树,最后是根结点. 算法思路是先根据前序遍历的第一个结点或者后序遍历的最后一个结点,查找对应在中序遍历中的位置,就可以确定左子树包含的元素和右子树包含的元素,最后通过递归来实现就可以了. 二叉树的表示形式为 //二叉树的结构表示为 class TreeNode { int val; TreeNode left; TreeNode right; TreeNo

根据前序遍历和中序遍历求后序遍历

根据前序遍历和中序遍历求后序遍历 一道HULU的笔试题(How I wish yesterday once more) 假设有棵树,长下面这个样子,它的前序遍历,中序遍历,后续遍历都很容易知道. PreOrder:         GDAFEMHZ InOrder:            ADEFGHMZ PostOrder:       AEFDHZMG 现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢?比如,已知一棵树的前序遍历是"GDAFEMHZ",而中序遍历是"AD

已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?

对一棵二叉树进行遍历,我们可以采取3中顺序进行遍历,分别是前序遍历.中序遍历和后序遍历.这三种方式是以访问父节点的顺序来进行命名的.假设父节点是N,左节点是L,右节点是R,那么对应的访问遍历顺序如下: 前序遍历    N->L->R 中序遍历    L->N->R 后序遍历    L->R->N /***************************************************************************************

前序遍历与中序遍历确定后序遍历

1003. 二叉树后序遍历     Total: 137 Accepted: 80                 Time Limit: 3sec    Memory Limit:256MB Description 给定一棵二叉树的前序和中序遍历顺序,输出后序遍历顺序 Input 第一行是二叉树的前序遍历顺序.二叉树的结点个数<=26,每个结点以一个大写字母表示,结点字母之间没有间隔.第二行是这棵二叉树的中序遍历顺序,表示方法和前序相同.(注:在左子树和右子树之间总是先左后右) Output

二叉树、前序遍历、中序遍历、后序遍历

一.树 在谈二叉树前先谈下树和图的概念 树:不包含回路的连通无向图(树是一种简单的非线性结构) 树有着不包含回路这个特点,所以树就被赋予了很多特性 1.一棵树中任意两个结点有且仅有唯一的一条路径连通 2.一棵树如果有n个结点,那它一定恰好有n-1条边 3.在一棵树中加一条边将会构成一个回路 4.树中有且仅有一个没有前驱的结点称为根结点 在对树进行讨论的时候将树中的每个点称为结点, 根结点:没有父结点的结点 叶结点:没有子结点的结点 内部结点:一个结点既不是根结点也不是叶结点 每个结点还有深度,比

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

问题描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 思路: 在二叉树的前序遍历序列中,第一个数字总是树的根结点的值.但在中序遍历序列中,根结点的值在序列的中间,左子树的结点的值位于根结点的值的左边,而右子树的结点的值位于根结点的值的右边.因此我们需要扫描中序遍历序列,才能找到根结点的值. 如下图所示,

二叉树--已知先序中序求后序--已知中序后序求先序(基本按照网上某大神思路搬过来的)

思路来自(转载自)  http://www.cnblogs.com/fzhe/archive/2013/01/07/2849040.html 题目描述不说了. 前序遍历:  GDAFEMHZ 中序遍历:  ADEFGHMZ 求中序遍历. 1 确定根,确定左子树,确定右子树. 2 在左子树中递归. 3 在右子树中递归. 4 打印当前根. 代码如下: 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 char pr[1000],in[100

027依据前序遍历和中序遍历,重建二叉树(keep it up)

剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1385 题目描写叙述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.如果输入的前序遍历和中序遍历的结果中都不含反复的数字. 比如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列. 输入: 输入可能包括多个測试例子,对于每一个測试案例, 输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点