HDOJ1710 Binary Tree Traversals

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1710

题目描述:知道二叉树先序遍历序列和中序遍历序列,输出后序遍历序列.

解题思路:先序遍历序列的第一个值为根节点,在中序遍历序列中找到根节点所在位置.中序遍历序列根节点之前的序列为左孩子树的所有节点,之后的序列为右孩子树的所有节点.接着又在先序遍历序列中找到左右子树根节点,照次递归建立二叉树.

  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. using namespace std;
  5. struct BiNode
  6. {
  7.     string data;
  8.     BiNode *lChild;
  9.     BiNode *rChild;
  10. };
  11. typedef BiNode* BiTree;
  12. //建立树
  13. void CreatBinaryTree(BiTree &T,vector<string>::const_iterator preIter,vector<string>::const_iterator inIter,int len)
  14. {
  15.     if(len<=0)
  16.     {
  17.         T=NULL;
  18.         return;
  19.     }
  20.     T=new BiNode; 
  21.     T->data=*preIter;
  22.     vector<string>::const_iterator inIterOrigin=inIter;
  23.     for(int i=0;i<len;++i)
  24.     {
  25.         if(*inIter==*preIter)
  26.             break;
  27.         inIter++;
  28.     }
  29.     CreatBinaryTree(T->lChild,preIter+1,inIterOrigin,i);
  30.     CreatBinaryTree(T->rChild,preIter+1+i,inIterOrigin+i+1,len-1-i);
  31. }
  32. void DestroyBinaryTree(BiTree &T)//删除树
  33. {
  34.     if(T==NULL) 
  35.         return
  36.     DestroyBinaryTree(T->lChild); 
  37.     DestroyBinaryTree(T->rChild); 
  38.     delete T; 
  39. }
  40. void PrintPostOrderTree(const BiTree &T,const string &rootValue)//后序遍历输出节点值
  41. {
  42.     if(T==NULL)
  43.         return;
  44.     PrintPostOrderTree(T->lChild,rootValue);
  45.     PrintPostOrderTree(T->rChild,rootValue);
  46.     cout<<T->data;
  47.     if(T->data != rootValue)
  48.         cout<<" ";
  49. }
  50. int main()
  51. {
  52.     int i,len;
  53.     string temp,rootValue;
  54.     vector<string> preOrder,inOrder;
  55.     BiTree T;
  56.     while(cin>>len)
  57.     {       
  58.         preOrder.clear();
  59.         inOrder.clear();
  60.         for(i=0;i<len;++i)
  61.         {
  62.             cin>>temp;
  63.             preOrder.push_back(temp);
  64.         }       
  65.         for(i=0;i<len;++i)
  66.         {
  67.             cin>>temp;
  68.             inOrder.push_back(temp);
  69.         }
  70.         rootValue=preOrder[0];//根节点值
  71.         CreatBinaryTree(T,preOrder.begin(),inOrder.begin(),len);
  72.         PrintPostOrderTree(T,rootValue);
  73.         cout<<endl;
  74.         DestroyBinaryTree(T);
  75.     }
  76.     
  77.     return 0;
  78. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值