先根建树中序遍历

Description
1、问题描述
给定一棵按“先根”遍历存储表示的二叉树,请中根遍历这棵二叉树。


2、二叉树创建说明
⑴、按“先根”遍历存储表示的二叉树中,如果在遍历过程中,发现子树为空,输出0
⑵、例如:A有B子树,没有右子树,其“先根”遍历为A B 0 0 0
⑶、例如:A为根,B为A的右孩子;C为B的左孩子,D为B的右孩子,其“先根”遍历为A 0 B C 0 0 D 0 0




Input
第一行:先根遍历的二叉树结点数目(包括空结点)
第二行:n个“先根”遍历二叉树字符序列(用空格隔开)(字符0表示空结点)




Output
第一行:二叉树的中根遍历序列(结点用空格隔开)(最后一个结点之后也留有空格)




Sample Input
9
A 0 B C 0 0 D 0 0


Sample Output
A C B D 


#include <iostream> 

using namespace std; 

#include <string> 

    

const int Max = 30; 

   

class BiTreeNode{ 

public: 

   char data;  

   BiTreeNode *lchild;     

   BiTreeNode *rchild;     

   BiTreeNode():lchild(NULL), rchild(NULL){} 

}; 

    

class BiTree{ 

public: 

   BiTreeNode *root;   

   char strTree[Max]; 

   BiTreeNode *CreateBiTree(); 

   void PreOrder(BiTreeNode *t); 

   void InOrder(BiTreeNode *t); 

   void PostOrder(BiTreeNode *t); 

   int pos; 

public:  

   BiTree(){};           

   void CreateTree(char TreeArray[],int n);  

   void InOrder();         

}; 

 

void BiTree::CreateTree(charTreeArray[],int n)

{  

   pos = 0; int i;

   for(i = 0;i < n;i++) 

       strTree[i] = TreeArray[i];

    root = CreateBiTree(); 

 

BiTreeNode *BiTree::CreateBiTree()

{    

   BiTreeNode *T; 

   char ch; 

   ch = strTree[pos++]; 

   if(ch == '0') 

       T = NULL; 

   else{ 

       T = new BiTreeNode(); 

       T->data = ch;                    

       T->lchild = CreateBiTree();      

       T->rchild = CreateBiTree();       

   } 

   return T; 

void BiTree::InOrder()

{     

   InOrder(root); 

void BiTree::InOrder(BiTreeNode *t)

{   

   if(t)

   {                   

       InOrder(t->lchild);

       cout<<t->data<<" ";     

       InOrder(t->rchild);  

   } 

 

int main() 

   int i,n; 

   char str[Max];

   BiTree t; 

   //freopen("cin1.txt", "r", stdin); 

   cin>>n;

   for(i = 0;i < n; i++) 

       cin>>str[i]; 

       t.CreateTree(str, n);  

       t.InOrder();        

       cout<<endl; 

   

   return 0; 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值