二叉树的重建 已知前序 中序 求后序 递归的方法
2014-08-20 17:34
260 查看
算法介绍:
例如:先序遍历为DBACEGF,中序遍历为ABCDEFG。
递归的方法解决问题
先序串:DBACEGF,先序的第一个节点一定是根节点,这样我们就知道了根节点是D.
再看中序, 在中序串之中,根结点的前边的所有节点都是左子树中,ABCDEFG,所以D节点前面的ABC就是左子树的中序串。再看前续串 DBACEGF,由于左子树的节点是ABC,我们可以得到左子树的前续周游的串为: BAC.子树的前序串BAC,和中序串ABC ,我们就可以递归的把左子树给建立起来。 同样,可以建立起右子树。
二叉树的遍历多例子,使用str输入 使用静态变量向树中添加
例如:先序遍历为DBACEGF,中序遍历为ABCDEFG。
递归的方法解决问题
先序串:DBACEGF,先序的第一个节点一定是根节点,这样我们就知道了根节点是D.
再看中序, 在中序串之中,根结点的前边的所有节点都是左子树中,ABCDEFG,所以D节点前面的ABC就是左子树的中序串。再看前续串 DBACEGF,由于左子树的节点是ABC,我们可以得到左子树的前续周游的串为: BAC.子树的前序串BAC,和中序串ABC ,我们就可以递归的把左子树给建立起来。 同样,可以建立起右子树。
/* 描述:二叉树的重建 已知前序 中序 求后序 来源:http://www.cnblogs.com/lovell-liu/archive/2011/09/06/2169170.html 日期:20140820 */ #include <iostream> using namespace std; struct NODE{ NODE* pLeft; NODE* pRight; char chValue; }; int GetPos(char* str, char ch) // 得到元素位于字符串的位置,就隐含了一个要求,字符不能重复 { for(int i=0; i<strlen(str); i++) { if(ch==str[i]) { return i; } } return -1; } void Rebuild(char* pPreOrder, char* pInOrder, int nTreeLen, NODE** pRoot) { if(*pRoot==NULL) return; *pRoot=(NODE*)malloc(sizeof(NODE)); (*pRoot)->chValue = pPreOrder[0]; int i=GetPos(pInOrder, pPreOrder[0]); if(i>=nTreeLen-1) (*pRoot)->pRight=NULL; if(i==0) (*pRoot)->pLeft=NULL; Rebuild(&pPreOrder[1], pInOrder, i, &(*pRoot)->pLeft); Rebuild(&pPreOrder[i+1], &pInOrder[i+1],nTreeLen-i-1, &(*pRoot)->pRight); } void PostOrderRetrieval(NODE* root) //后序遍历树 { if(root==NULL) return; if(root->pLeft !=NULL) PostOrderRetrieval(root->pLeft); if(root->pRight !=NULL) PostOrderRetrieval(root->pRight); printf("%c ", root->chValue); } int main() { NODE** root; root = (NODE**)malloc(sizeof(NODE*)); Rebuild("abdehcfgij", "dbheafcgji", 10, root); printf("后序遍历该树的结果为:\n"); PostOrderRetrieval(*root); printf("\n"); free(*root); free(root); }
二叉树的遍历多例子,使用str输入 使用静态变量向树中添加
#include<stdio.h> #include<stdlib.h> #include<string> #include <iostream> using namespace std; typedef struct node { char num; node* left; node* right; }node,*pnode; static int len=-1;//全局的静态变量自动增加,确定加入的字符 void CreatTree(pnode* p,string str)//注意是node* * { char c; node* tp; c=str[++len]; if ('#'==c) { *p=NULL; } else { tp=new(node); tp->left=NULL; tp->right=NULL; tp->num=c; *p=tp; CreatTree(&(*p)->left,str); CreatTree(&(*p)->right,str); } } void DestroyTree(pnode *p) { /* 初始条件: 二叉树T存在。操作结果: 销毁二叉树T */ if(*p) /* 非空树 */ { if((*p)->left) /* 有左孩子 */ DestroyTree(&(*p)->left); /* 销毁左孩子子树 */ if((*p)->right) /* 有右孩子 */ DestroyTree(&(*p)->right); /* 销毁右孩子子树 */ free(*p); /* 释放根结点 */ *p=NULL; /* 空指针赋0 */ } } void travel(node *p) { if (p) { travel(p->left); cout<<p->num<<" "; travel(p->right); } } int main() { string str; while (cin>>str) { len=-1;; node *root=NULL; CreatTree(&root,str); travel(root); cout<<endl; DestroyTree(&root); } return 1; }
相关文章推荐
- 前序和中序重建二叉树, 树的前序递归,中序递归,后序递归遍历和前序非递归,中序非递归,后序非递归遍历
- 二叉树的先序、中序、后序遍历方法(递归与非递归方法)——《数据结构》
- 用递归方法对二叉树进行先序、中序和后序遍历
- 先序,中序,后序,求叶子结点数,深度,拷贝,几种二叉树的常见递归使用方法
- 根据前序遍历和中序遍历结果重建二叉树(递归方法)
- 第6章 树和二叉树——递归方法先序、中序、后序遍历二叉链表表示的二叉树
- 二叉树(14)----由前序遍历和中序遍历重建二叉树,递归方式
- 二叉树的前序、中序、后序遍历的非递归方法 python
- 输入前序/后序+中序 遍历结果重建二叉树(递归)
- Java实现二叉树的前序、中序、后序遍历(非递归方法)
- 递归和非递归俩种方法实现二叉树的前序、中序、后续遍历
- 二叉树(14)----由前序遍历和中序遍历重建二叉树,递归方式
- 递归方法 前序 中序 后序 遍历二叉树
- 数据结构 分别用递归和非递归方法实现二叉树先序,中序,后序遍历
- 根据前序遍历和中序遍历结果重建二叉树(递归方法)
- 【工程】二叉树已知前序/中序的顺序,构造树的递归等实现
- 二叉树前序、中序和后序的遍历方法(递归、用栈和使用线索化)
- 根据前序和中序数组构造二叉树(递归方法)
- 二叉树的重建--已知中序和前序或中序和后序逆向构建二叉树
- 已知二叉树的前序遍历和中序遍历的结果,重建二叉树