已知中序和先序,求二叉树的重构问题

本文详细介绍了如何使用二重指针解决二叉树重建问题,包括生成二叉链表和实现后序遍历。通过实例演示,帮助读者理解二叉树的构造过程,并提供了一种有效的方法来解析输入并构建相应的二叉树结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值