用二叉树的中序和前序还原二叉树 | |||
主要解答者: | Betta | 提交人: | langhaixin |
感谢: | totobi、leemars、Betta | ||
审核者: | starfish | 社区对应贴子: | 查看 |
A : | |||
假设二叉树T的结点值是字符,已知T中结点的前序和中序 试编写一个把树T按标准形式进行存储的C函数。 二叉树的标准存储形式为 tpyedef struct bt { char data; struct bt *lefttree; struct bt *righttree; } BinaryTree --------------------------------------------------------------- BrinaryTree *Q[maxsize]; BrinaryTree *CREATREE() {char ch; int fornt,rear; BrinaryTree *root,*s; root=NULL; front=1;rear=0; ch=getchar(); while(ch!='#') {s=NULL; if(ch!='@') { s=malloc(sizeof(BinaryTree)); s->data=ch; s->lefttree=Null; s->righttree=Null; } rear++; Q[rear]=s; if(rear==1) root=s; else {if(s&& Q[front]) if (rear%2==0) Q[front]->lefttree=s; else Q[front]->righttree=s; if(rear%2==1) front++; } ch=getchar; } return root; } --------------------------------------------------------------- 我举个例子吧 已知前序是ABCDEFG 中序是CBEDAFG 求二叉树 首先从取前序第1个字母(A) 按此字母把中序分成两段 (CBED) (AFG) A做根 (CBED)做左子树 (FG)右子树 再按长度把前序后面的部分分成(BCDE) (FG) 问题就转换成 已知前序是BCDE 中序是CBED 求二叉树 和 已经前序是FG 中序是FG 求二叉树 看出来了没有,递归求解的. 下面的步骤省略分析. 前序 中序 : 根 左子树分解 右子树分解 BCDE CBED : B (C) (C) (ED) (DE) C C : C DE ED : D (E) (E) E E : E FG FG : F (G) (G) G G : G 得出的二叉树就是 A / / B F / / / C D G / E --------------------------------------------------------------- 这个是按 LeeMaRS(小菜虎) 的算法描述写的程序: 编译: //VC cl -GX treep.cpp //gcc g++ -o treep treep.cpp #include <iostream> class CTreeNode { public: CTreeNode(char cVal, CTreeNode * pLeft=0, CTreeNode * pRight=0) : m_cVal(cVal) , m_pLeft(pLeft) , m_pRight(pRight) { } ~CTreeNode() { if(m_pLeft != 0) { delete m_pLeft ; } std::cout << m_cVal ; if(m_pRight != 0) { delete m_pRight ; } } char m_cVal ; CTreeNode * m_pLeft ; CTreeNode * m_pRight ; } ; CTreeNode * CreateNode(char * sPre, char * sMid, int nSize) { if(nSize == 0) return 0 ; if(nSize == 1) return new CTreeNode(*sPre) ; int nSplitMid ; for(nSplitMid=0; nSplitMid<nSize; ++nSplitMid) { if(sMid[nSplitMid] == sPre[0]) break ; } if(nSplitMid == nSize) return 0 ; return new CTreeNode(*sPre, CreateNode(sPre+1, sMid, nSplitMid), CreateNode(sPre+nSplitMid+1, sMid+nSplitMid+1, nSize-nSplitMid-1)) ; } int main() { CTreeNode * p = CreateNode("ABCDEFG", "CBEDAFG", 7) ; if(p != 0) delete p ; std::cout << std::endl ; return 0 ; } |
用二叉树的中序和前序还原二叉树
最新推荐文章于 2021-12-11 23:20:40 发布