已知前序和中序遍历恢复二叉树(递归)
2013-07-17 13:32
288 查看
#include<iostream> using namespace std; #define TREELEN 6 //数据结构定义 struct NODE { NODE* pLeft; //左子树 NODE* pRight; //右子树 char chValue; //该节点的值 }; void ReBuild(char* pPreOrder,char* pInOrder,int nTreeLen,NODE** pRoot) { //检查边界条件 if(pPreOrder==NULL || pInOrder==NULL) { return; } //获得前序遍历的第一个节点 NODE* pTemp = new NODE; pTemp->chValue = *pPreOrder; pTemp->pLeft = NULL; pTemp->pRight = NULL; //如果节点为空,把当前节点复制到根节点 if(*pRoot == NULL) { *pRoot = pTemp; } //如果当前树长度为1,那么已经是最后一个节点 if(nTreeLen == 1) { return; } //寻找子树长度 char* pOrgInOrder = pInOrder; char* pLeftEnd = pInOrder; int nTempLen = 0; //找到左子树的结尾 while(*pPreOrder != *pLeftEnd) { if(pPreOrder==NULL || pLeftEnd==NULL) { return; } nTempLen++; //记录临时长度,以免溢出 if(nTempLen > nTreeLen) { break; } pLeftEnd++; } //寻找左子树长度 int nLeftLen = 0; nLeftLen = (int)(pLeftEnd-pOrgInOrder); //寻找右子树长度 int nRightLen = 0; 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 PrePrint(NODE* pRoot) { if(pRoot == NULL) { return; } cout<<pRoot->chValue<<" "; PrePrint(pRoot->pLeft); PrePrint(pRoot->pRight); } //中序遍历结果 void InPrint(NODE* pRoot) { if(pRoot == NULL) { return; } InPrint(pRoot->pLeft); cout<<pRoot->chValue<<" "; InPrint(pRoot->pRight); } void main() { char szPreOrder[TREELEN] = {'a','b','d','c','e','f'}; char szInOrder[TREELEN] = {'d','b','a','e','c','f'}; NODE* pRoot = NULL; ReBuild(szPreOrder,szInOrder,TREELEN,&pRoot); PrePrint(pRoot); cout<<endl<<endl;; InPrint(pRoot); cout<<endl; } /* a b d c e f d b a e c f */
相关文章推荐
- 已知前序和中序遍历恢复二叉树
- 已知前序和中序遍历恢复二叉树
- 利用先序和中序非递归恢复二叉树,并后序遍历输出
- 二叉树 已知两种遍历恢复二叉树
- 数据结构学习笔记(9)---已知二叉树的遍历序列,恢复二叉树
- 数据结构 二叉树 已知前序中序遍历求后续遍历的递归实现
- 已知前序遍历和中序遍历结果构造二叉树(非递归解法)
- 二叉树之先序遍历(递归和非递归两种遍历)
- 数据结构--二叉树--中序递归遍历二叉树(链式结构)
- C语言遍历二叉树的递归调用操作集
- 二叉树先中后序遍历(递归、非递归方法)、层序遍历 Java实现
- 线索二叉树 Threaded Binary Tree (不用递归,不用栈,遍历二叉树)
- 二叉树的三种遍历方法(递归和非递归)
- 用非递归的方法遍历二叉树
- 二叉树的递归遍历与非递归改写
- 辛星算法教程第一节即二叉树的递归遍历
- 二叉树的遍历的迭代和递归实现方式
- 二叉树的先序以及后序递归建立,先中后序递归遍历。
- 二叉树的建立以及先序中序后序递归遍历
- 二叉树前、中、后及层次非递归遍历