根据前序和中序遍历结果重建二叉树
2012-05-08 10:03
260 查看
解决思想:根据前序遍历的结果得到树根(包括子树)将中序遍历的结果划分成左右子树,来进行递归
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node
{
char chValue;
struct Node *lChild;
struct Node *rChild;
}Node;
//重建二叉树
void Rebuild(char*pPreOrder , char*pInOrder , Node **pRoot , int nTreeLen)
{
int nLeftLen , nRightLen; //左右子树长度
char* pLeftEnd; //查找左子树的结束位置,以便确定左子树长度
Node *p;
//边界条件检查
if(!pPreOrder ||!pInOrder ||!pRoot) return;
if(!(p = (Node *)malloc(sizeof(Node)))) return;
p->chValue =*pPreOrder; //p为前序遍历的第一个节点
p->lChild = p->rChild = NULL;
if(*pRoot==NULL) //若根节点为空,则把当前第一个节点赋值给根节点
*pRoot = p;
if(nTreeLen ==1) return; //树长度为一,已经到结尾,直接返回
//划分左右子数
pLeftEnd = pInOrder;
while(*pLeftEnd !=*pPreOrder) pLeftEnd++;
nLeftLen = (int)(pLeftEnd - pInOrder);
nRightLen = nTreeLen - nLeftLen -1;
if(nLeftLen) Rebuild(pPreOrder +1 , pInOrder , &((*p)->lChild) , nLeftLen); //递归重建左子树
if(nRightLen) Rebuild(pPreOrder + nLeftLen +1, pInOrder + nLeftLen +1 , &((*p)->rChild) , nRightLen);//递归重建右子树
}
//后序遍历
void PostOrder(Node *p)
{
if(p)
{
PostOrder(p->lChild);
PostOrder(p->rChild);
printf("%c",p->chValue);
}
}
int main(void)
{
char PreOrder[32] , InOrder[32];
Node *pTree;
//输入先序和中序序列
while(scanf("%s%s", PreOrder , InOrder) != EOF)
{
Rebuild(PreOrder , InOrder , &pTree , strlen(PreOrder));
PostOrder(pTree);
printf("\n");
}
return0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node
{
char chValue;
struct Node *lChild;
struct Node *rChild;
}Node;
//重建二叉树
void Rebuild(char*pPreOrder , char*pInOrder , Node **pRoot , int nTreeLen)
{
int nLeftLen , nRightLen; //左右子树长度
char* pLeftEnd; //查找左子树的结束位置,以便确定左子树长度
Node *p;
//边界条件检查
if(!pPreOrder ||!pInOrder ||!pRoot) return;
if(!(p = (Node *)malloc(sizeof(Node)))) return;
p->chValue =*pPreOrder; //p为前序遍历的第一个节点
p->lChild = p->rChild = NULL;
if(*pRoot==NULL) //若根节点为空,则把当前第一个节点赋值给根节点
*pRoot = p;
if(nTreeLen ==1) return; //树长度为一,已经到结尾,直接返回
//划分左右子数
pLeftEnd = pInOrder;
while(*pLeftEnd !=*pPreOrder) pLeftEnd++;
nLeftLen = (int)(pLeftEnd - pInOrder);
nRightLen = nTreeLen - nLeftLen -1;
if(nLeftLen) Rebuild(pPreOrder +1 , pInOrder , &((*p)->lChild) , nLeftLen); //递归重建左子树
if(nRightLen) Rebuild(pPreOrder + nLeftLen +1, pInOrder + nLeftLen +1 , &((*p)->rChild) , nRightLen);//递归重建右子树
}
//后序遍历
void PostOrder(Node *p)
{
if(p)
{
PostOrder(p->lChild);
PostOrder(p->rChild);
printf("%c",p->chValue);
}
}
int main(void)
{
char PreOrder[32] , InOrder[32];
Node *pTree;
//输入先序和中序序列
while(scanf("%s%s", PreOrder , InOrder) != EOF)
{
Rebuild(PreOrder , InOrder , &pTree , strlen(PreOrder));
PostOrder(pTree);
printf("\n");
}
return0;
}
相关文章推荐
- 重建二叉树---根据前序和中序遍历结果重建二叉树
- 重建二叉树---根据前序和中序遍历结果重建二叉树
- Python练手之根据前序和中序&根据中序和后序重建二叉树,输出前序、中序和后序遍历结果
- 重建二叉树(根据前序和中序遍历结果)
- 第四题:根据前序和中序遍历结果重建二叉树(Arrays常用方法)
- 根据前序和中序遍历结果重建二叉树
- 重建二叉树,输入某二叉树的前序遍历和中序遍历的结果,重建出二叉树,假设输入的前序和中序遍历结果中不含重复的数字
- 根据二叉树的前序遍历和中序遍历结果重建二叉树
- 根据前序遍历和中序遍历结果重建二叉树(递归方法)
- 编程之美--根据遍历结果重建二叉树
- 剑指offer刷题之c++实现的根据二叉树的前序和中序遍历重建二叉树
- 二叉树问题-根据前序遍历结果和中序遍历结果得出后序遍历结果
- 【面试题】剑指Offer-6-根据前序和中序遍历重建二叉树
- 已知二叉树的前序遍历结果和中序遍历结果,请重建原来的二叉树
- 剑指:根据输入的前序和中续遍历序列重建二叉树
- 根据二叉树的前序遍历和中序遍历结果重建出该二叉树
- 根据前序和中序遍历重建二叉树
- 输入某二叉树的前序和中序遍历结果,重建该二叉树
- 根据二叉树的前序遍历和中序遍历的结果重建出该二叉树
- 根据二叉树中序和后序(先序)遍历结果 重建二叉树