前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构 第13讲 三元组 (F、C、L/R) 序列创建二叉树

数据结构 第13讲 三元组 (F、C、L/R) 序列创建二叉树

作者头像
rainchxy
发布2018-09-13 15:51:23
1.4K0
发布2018-09-13 15:51:23
举报
文章被收录于专栏:趣学算法趣学算法趣学算法

/* 输入三元组 (F、C、L/R) 序列输入一棵二叉树的诸边(其中 F 表示双亲结点的标识,C 表示孩子结点标识,L/R 表示 C 为 F 的左孩子或右孩子), 且在输入的三元组序列中,C 是按层次顺序出现的。 设结点的标识是字符类型。F=NULL时 C 为根结点标识,若 C 亦为NULL,则表示输入结束。 试编写算法,由输入的三元组序列建立二叉树的二叉链表,并以先序、中序、后序序列输出。 */ /*测试数据 NULL A L A B L A C R B D R C E L C F R D G L F H L NULL NULL L

*/

解题思路:

1、首先创建二叉树结构体结点。

2、输入第一个数据,创建根结点入队。因为按层次输入的,因此要使用队列。

3、输入数据,队头元素出队,判断队头元素是否和输入数据中的父亲相等,如果相等,判断创建左孩子还是右孩子。创建后,孩子入队。再次输入数据,队头元素是否和输入数据中的父亲相等,如果相等,判断创建左孩子还是右孩子。创建后,孩子入队。(因为一个队头元素,可能有两个孩子,因此不能创建一个孩子就结束。)

4、循环,直到队列为空或者a,b为空停止,创建树成功。

5、输出先序、中序、后序序列。

#include <iostream>
 #include<cstring>
 #include<queue>
 using namespace std;
 struct biTnode
 {
     string data;
     biTnode *lChild,*rChild;
 };
  biTnode* T=NULL;
 void CreatebiTree(biTnode* &T)
 {
     string a,b,c;
     biTnode *node,*p;
     queue<biTnode*>q;
     cin>>a>>b>>c;
     if(a=="NULL" && b!="NULL")//创建根结点
     {
         node=new biTnode;
         node->data=b;
         node->lChild=node->rChild=NULL;
         T=node;
         q.push(T);
     }
     cin>>a>>b>>c;
     while(!q.empty()&&a!="NULL"&&b!="NULL")
     {
         p=q.front();
         q.pop();
         while(a==p->data)
         {
             node=new biTnode;
             node->data=b;
             node->lChild=node->rChild=NULL;
             if(c=="L")
             {
                 p->lChild=node;
                 cout<<p->data<<"'s lChild is "<<node->data<<endl;
             }
             else
             {
                 p->rChild=node;
                 cout<<p->data<<"'s rChild is "<<node->data<<endl;
             }
             q.push(node);
             cin>>a>>b>>c;
         }
     }
 }




 void preorder(biTnode* &T)
 {
     if(T)
     {
        cout<<T->data<<"  ";
        preorder(T->lChild);
        preorder(T->rChild);
     }
 }


 void inorder(biTnode* &T)
 {
     if(T)
     {
        inorder(T->lChild);
        cout<<T->data<<"  ";
        inorder(T->rChild);
     }
 }


 void posorder(biTnode* &T)
 {
     if(T)
     {
        posorder(T->lChild);
        posorder(T->rChild);
        cout<<T->data<<"  ";
     }
 }
 int main()
 {
     cout << "输入结点数据a,b,c(a为父亲,b为结点字符,c为‘L’左孩子或‘R’右孩子)" << endl;
     CreatebiTree(T);
     cout << "创建树成功!" << endl;
     cout << "先序遍历:" << endl;
     preorder(T);
     cout<<endl<< "中序遍历:" << endl;
     inorder(T);
     cout<<endl<< "后序遍历:" << endl;
     posorder(T);
     return 0;
 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年08月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档