已知树的前序和中序遍历,求后序遍历;后序和中序,求前序
来源:互联网 发布:乐乎公寓工作怎么样 编辑:程序博客网 时间:2024/06/05 04:57
首先需要说明的是,网上不知道为什么很多误传,说给定前序、中序和后序中的两个,可以唯一确定另一个,显然这是错误的。给定前序和后序,是无法确定中序的,一个最简单的例子就是只有两个节点的树,前序和后序给定,中序无法确定。
代码如下:
/*
* Copyright (c) 2014
* All Rights Reserved.
* author: laohaizi
*/
#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h>
using namespace std;
typedef struct _NODE
{
char name;
struct _NODE *left,*right;
}NODE;
char *preorder="abcdefg";
char *inorder="cbedagf";
//char *inorder="abcdefg";
char *postorder="cedbgfa";
const int preorder_len = strlen(preorder);
const int inorder_len = strlen(inorder);
const int postorder_len = strlen(postorder);
NODE * PostOrder(char *preorder, int prebeg, int preend, char *inorder, int inbeg, int inend)
{
if (prebeg > preend || inbeg > inend || prebeg >= preorder_len || inbeg >= inorder_len || preend < 0 || inend < 0)
{
return NULL;
}
NODE *p = new NODE;
p->name = preorder[prebeg];
int k = 0;
int cnt = 0;
for (k = inbeg; k <= inend; ++k)
{
cnt ++;
if (inorder[k] == preorder[prebeg])
{
break;
}
}
p->left = PostOrder(preorder,prebeg+1,prebeg+cnt-1,inorder,inbeg,k-1);
p->right = PostOrder(preorder,prebeg+cnt,preend,inorder,k+1,inend);
return p;
}
NODE * PreOrder(char *postorder, int postbeg, int postend, char *inorder, int inbeg, int inend)
{
if (postbeg > postend || inbeg > inend || postbeg >= postorder_len || inbeg >= inorder_len || postend < 0 || inend < 0)
{
return NULL;
}
NODE *p = new NODE;
p->name = postorder[postend];
int k = 0;
int cnt = 0;
for (k = inbeg; k <= inend; ++k)
{
cnt ++;
if (inorder[k] == postorder[postend])
{
break;
}
}
p->left = PreOrder(postorder,postbeg,postbeg+cnt-2,inorder,inbeg,k-1);
p->right = PreOrder(postorder,postbeg+cnt-1,postend-1,inorder,k+1,inend);
return p;
}
int NodeNum(NODE *p)
{
if (p == NULL)
return 0;
return NodeNum(p->left)+NodeNum(p->right)+1;
}
void PostorderTraverse(NODE *p)
{
if(p != NULL)
{
PostorderTraverse(p->left);
PostorderTraverse(p->right);
cout<<p->name;
}
}
void PreorderTraverse(NODE *p)
{
if(p != NULL)
{
cout<<p->name;
PreorderTraverse(p->left);
PreorderTraverse(p->right);
}
}
int main()
{
//get postorder
NODE *root = PostOrder(preorder,0,preorder_len-1,inorder,0,inorder_len-1);
int nodenum = NodeNum(root);
if (nodenum != preorder_len)
{
cout<<"post order not exist."<<endl;
return 0;
}
cout<<"post order: ";
PostorderTraverse(root);
cout<<endl;
//get preorder
root = PreOrder(postorder,0,postorder_len-1,inorder,0,inorder_len-1);
nodenum = NodeNum(root);
if (nodenum != postorder_len)
{
cout<<"pre order not exist."<<endl;
//return 0;
}
cout<<"pre order: ";
PreorderTraverse(root);
cout<<endl;
return 0;
}
- 已知树的前序和中序遍历,求后序遍历;后序和中序,求前序
- 已知二叉树的前序/后序遍历和中序遍历,求后序/前序遍历
- 已知二叉树的前序/后序遍历和中序遍历,求后序/前序遍历
- 已知二叉树的前序/后序遍历和中序遍历,求后序/前序遍历
- 已知二叉树的前序/后序遍历和中序遍历,求后序/前序遍历
- 已知二叉树的前序/后序遍历和中序遍历,求后序/前序遍历
- 已知前序遍历和中序遍历,求后序遍历
- 已知前序遍历和中序遍历,求后序遍历
- 已知前序遍历和中序遍历,求后序遍历
- 已知前序遍历和中序遍历求后序遍历
- 已知中序遍历和前序遍历,求后序遍历
- 已知二叉树的后序/前序遍历和中序遍历,求前序/中序遍历
- 已知中序遍历和后序遍历,求前序遍历
- 已知后序遍历和中序遍历求前序遍历
- 二叉树遍历---已知前序遍历和中序遍历求其后序
- 已知树的前序遍历和中序遍历,求后序遍历的方法(转)
- 已知二叉树的前序遍历和中序遍历求后序遍历(二叉树)
- 二叉树系列:已知二叉树的中序遍历和前序遍历,求后序遍历
- Android的animation由四种类型组成
- TCP/IP三种传送方式(单播,广播,组播)解析
- W3150A应用笔记--如何使用多播传输
- 对linux下各种profiling工具的心得
- Android MP3录音功能
- 已知树的前序和中序遍历,求后序遍历;后序和中序,求前序
- iOS APNS远程推送(史上最全步骤)
- 潜意识对人行为的影响--《潜意识-控制你行为的秘密》
- C#2.属性心得
- CALLBACK回调函数使用之一
- Torrent文件
- hdu2578Dating with girls(1)
- 题目1451:不容易系列之一(错排公式)
- OpenGL设置线型