已知中序和先序,求二叉树的重构问题
2011-05-23 15:58
225 查看
http://www.cnblogs.com/DiaoCow/archive/2010/04/17/1714273.html
这里用二重指针的问题困扰了我好久,不然只用一重指针出不来结果或者执行不下去。因为显示时调用了PostOrder函数,所以必须先生成一个二叉链表(PostOrder函数对此二叉链表的根操作),而输入只是两行字符串,所以还要生成二叉链表!!可能这就是用二重指针的原因。程序如下,已经过多种情况的测试:
#include<iostream.h>
#include<string.h>
struct NODE{
NODE *pLeft;
NODE *pRight;
char chValue;
};
void Rebuild(char* pPreOrder, char* pInOrder, int nTreeLen, NODE **pRoot)
{
NODE *pTemp=new NODE;
pTemp->chValue=*pPreOrder;
pTemp->pLeft=pTemp->pRight=NULL;
*pRoot=pTemp;
if(nTreeLen==1) return; //边界条件,递归出口条件就是它
char* pLeftEnd=pInOrder;
int nLeftLen,nRightLen;
while(*pPreOrder!=*pLeftEnd)
pLeftEnd++;
nLeftLen=pLeftEnd-pInOrder; //划分左右子树
nRightLen=nTreeLen-nLeftLen-1;
if(nLeftLen>0)
Rebuild(pPreOrder+1,pInOrder,nLeftLen,&(pTemp->pLeft)); //递归求解左子树
if(nRightLen>0)
Rebuild(pPreOrder+nLeftLen+1,pInOrder+nLeftLen+1,nRightLen,&(pTemp->pRight)); //递归求解右子树
}
void PostOrder(NODE *p) //后序遍历
{
if(p)
{
PostOrder(p->pLeft);
PostOrder(p->pRight);
cout<<p->chValue<<” “;
}
}
void main()
{
char* szPreOrder=”abcdefg”;
char* szInOrder=”dcbaefg”;
NODE *Root=NULL;
Rebuild(szPreOrder,szInOrder,strlen(szPreOrder),&Root);
PostOrder(Root);
}
或者用指针的引用,而不用二重指针可以如下:
#include<iostream.h>
#include<string.h>
struct NODE{
NODE *pLeft;
NODE *pRight;
char chValue;
};
void Rebuild(char* pPreOrder, char* pInOrder, int nTreeLen, NODE *&pRoot) //用指针的引用,则只用单重指针
{
NODE *pTemp=new NODE;
pTemp->chValue=*pPreOrder;
pTemp->pLeft=pTemp->pRight=NULL;
pRoot=pTemp;
if(nTreeLen==1) return; //边界条件,递归出口条件就是它
char* pLeftEnd=pInOrder;
int nLeftLen,nRightLen;
while(*pPreOrder!=*pLeftEnd)
pLeftEnd++;
nLeftLen=pLeftEnd-pInOrder; //划分左右子树
nRightLen=nTreeLen-nLeftLen-1;
if(nLeftLen>0)
Rebuild(pPreOrder+1,pInOrder,nLeftLen,pRoot->pLeft); //递归求解左子树
if(nRightLen>0)
Rebuild(pPreOrder+nLeftLen+1,pInOrder+nLeftLen+1,nRightLen,pRoot->pRight); //递归求解右子树
}
void PostOrder(NODE *p) //后序遍历
{
if(p)
{
PostOrder(p->pLeft);
PostOrder(p->pRight);
cout<<p->chValue<<” “;
}
}
void main()
{
char* szPreOrder=”abcdefg”;
char* szInOrder=”dcbaefg”;
NODE *Root=NULL;
Rebuild(szPreOrder,szInOrder,strlen(szPreOrder),Root);
PostOrder(Root);
}
相关文章推荐
- 已知二叉树的后序和中序排列,求先序排列再线索化的问题(笔试常考)
- 3.9已知二叉树的 前序遍历和中序遍历的结果,重构出原二叉树
- 深入分析由前序和中序重构二叉树问题
- 已知二叉树的后序和中序排列,求先序排列再线索化的问题(笔试常考)
- 已知二叉树的前序和中序遍历,重构该二叉树
- PAT 1020 已知中序后序,还原二叉树 (二叉树遍历问题)
- 已知二叉树的先序排列和中序排列,重构该二叉树,并输出该树的后序遍历
- 深入分析由前序和中序重构二叉树问题
- 剑指offer——已知二叉树的先序和中序排列,重构二叉树
- 关于二叉树的问题1-已知前序,中序求后序遍历
- 已知二叉树的前序和中序遍历,重构该二叉树
- 二叉树的遍历(前序 中序 后序)和已知两种遍历顺序求另外一种遍历顺序(含实例)
- 已知前序和中序、后序和中序建立二叉树
- 已知一颗二叉树S的前序遍历和中序遍历 序列,请编程输出二叉树S的后续遍历序列.
- 已知二叉树的前序,中序,后序遍历中的两个,求另一个
- 关于二叉树的前序、中序、后序问题
- 先序、中序和后序数组两两结合重构二叉树
- 二叉树的前、中、后序遍历与重构问题
- 已知二叉树的前序和中序,重建二叉树_笔记
- 已知先序和中序构建二叉树并且以层序输出