`
linest
  • 浏览: 155482 次
  • 性别: Icon_minigender_1
  • 来自: 内蒙古
社区版块
存档分类
最新评论

pat-1020* Tree Traversals

    博客分类:
  • pat
 
阅读更多
给后序和中序遍历
求层序遍历

Sample Input:7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

Sample Output:4 1 6 3 5 7 2

注意如果是按char型处理,还要考虑多字符情况  如12
在输入上要加以处理,用int比较简单

#include "stdio.h"
#include "stdlib.h"


typedef struct bt_node    // 定义二叉树结点。
{
   char data ;
   struct bt_node * left ;
   struct bt_node * right ;
} bt_node ;

//搜索根在中序数组中的下标,若两个序列存在逻辑错误结束程序。
int search(char in[] , int inl , int inh , char ch)
{
   int i ;
   for(i=inl;i<=inh;i++)
   {
       if(in[i]==ch) return i ;
   } 
   printf("两个序列相互矛盾,无法构造二叉树!\n") ;
   exit(1) ;
}

//中根序列、后跟序列构造二叉树。
bt_node * create_bt1(char in[],int inl,int inh,char post[],int postl,int posth)
{
   int mid ;
   bt_node * r ;
   if(inl>inh||postl>posth) return NULL; //递归结束条件。
   mid    = search(in , inl , inh , post[posth]) ; //搜索根在中序数组中的下标。
   //printf("%d\n" , mid) ;可以通过这个语句查看有没有搜索正确。
   r = (bt_node *)malloc(sizeof(bt_node)) ;
   r->data = post[posth] ; //构造根结点。
   r->left = create_bt1(in,inl,mid-1, post,postl,postl+mid-inl-1) ; //构造左子树。
   r->right = create_bt1(in,mid+1,inh, post,postl+mid-inl,posth-1) ; //构造右子树。
   return r ; //返回根指针。
}

bt_node * create_bt2(char in[],int inl,int inh,char pre[],int prel,int preh)
{
   int mid ;
   bt_node * r ;
   if(inl>inh||prel>preh) return(NULL) ;
   mid = search(in , inl , inh , pre[prel]) ;
   //printf("%d\n" , mid) ;可以通过这个语句查看有没有搜索正确。
   r = (bt_node *)malloc(sizeof(bt_node)) ;
   r->data = pre[prel] ;
   r->left = create_bt2(in,inl,mid-1, pre,prel+1,prel+mid-inl) ;
   r->right = create_bt2(in,mid+1,preh, pre,prel+mid-inl+1,preh) ;
   return(r) ;
}

void pre_order(bt_node * r)
{
   if(r==NULL) return ;
   putchar(r->data) ;
   pre_order(r->left) ;
   pre_order(r->right) ;
}

void in_order(bt_node * r)
{
   if(r==NULL) return ;
   in_order(r->left) ;
   putchar(r->data) ;
   in_order(r->right) ;
}

void post_order(bt_node * r)
{
   if(r==NULL) return ;
   post_order(r->left) ;
   post_order(r->right) ;
   putchar(r->data) ;
}

//定义链队列结点。
typedef struct queue_node
{
   struct bt_node * bt_node_pointer ;
   struct queue_node * next ;
} queue_node ;

//二叉树的层次遍历。
void wfs_order(bt_node * r)
{
   queue_node * front , * rear , * mid ;
   front = (queue_node *)malloc(sizeof(queue_node)) ;
   rear = front ;
   mid = front ; //定义一个队列,并给予初始化。

   rear->bt_node_pointer = r ;
   rear = (queue_node *)malloc(sizeof(queue_node)) ;
   mid->next = rear ;
   mid = rear ; //r进队。

   while(front!=rear) //front!=rear指队列非空。
   {
       r = front->bt_node_pointer ;
	   printf("%d",r->data) ; //r出队,并打印r->data。
       front = front->next ;
       

       if(r->left != NULL) //r->left进队。
       {
           rear->bt_node_pointer = r->left ;
           rear = (queue_node *)malloc(sizeof(queue_node)) ;
           mid->next = rear ;
           mid = rear ;
       }

       if(r->right != NULL) //r->right进队。
       {
           rear->bt_node_pointer = r->right ;
           rear = (queue_node *)malloc(sizeof(queue_node)) ;
           mid->next = rear ;
           mid = rear ;
       }    

	   if(front != rear)
		   putchar(' ');
   }
}



int main()
{
	int N;
	int num;
	scanf("%d",&N);
	getchar();
	char* post = new char[N];
	char* in = new char[N];

	for(int i=0;i<N;i++)
	{
		scanf("%d",&num);
		post[i] = num;
	}

	for(int i=0;i<N;i++)
	{
		scanf("%d",&num);
		in[i] = num;
	}

	 bt_node * root = create_bt1(in,0,N-1, post,0,N-1);
	 wfs_order(root) ;
     putchar('\n') ;

	 return 0;
}




分享到:
评论

相关推荐

    03-树2. Tree Traversals Again.zip

    在计算机科学中,树是一种非线性数据结构,它由节点(或称为顶点)以及连接这些节点的边构成。树遍历是处理树数据结构时的重要操作,它包括多种方法,如前序遍历、中序遍历和后序遍历。本主题将深入探讨后序遍历,...

    pat题目分类.docx

    这些PAT甲级题目涵盖了多个计算机科学的基础知识点,主要包括字符串处理、哈希表的应用、图论问题和树结构的处理。接下来我们将对这些知识点进行详细解释。 1. **字符串处理**: - **修复键盘坏损** (1112 Stucked...

    陈越、何钦铭-数据结构作业11:Tree Traversals Again二叉树非递归遍历/栈遍历

    An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the ...

    Problem Solving Algorithms and Data Structures

    - **树遍历(Tree Traversals)**:讨论了遍历树的三种方法:前序遍历、中序遍历和后序遍历。 - **二叉搜索树(Binary Search Trees)**:详细解释了二叉搜索树的原理及其操作。 - **关键术语(Key Terms)**:总结了与树...

    7-1 Tree Traversals Again_DS_pta_C++_AgainAgain_

    标题 "7-1 Tree Traversals Again_DS_pta_C++_AgainAgain_" 指向的是一个关于数据结构(DS)的问题,特别是关于树遍历的议题,它源自编程训练平台 PTA(Programming Training Arena)的一个练习。"C++" 暗示了这个...

    neo4j-getting-started-4.0.pdf

    - **遍历和路径(Traversals and paths)**:图数据库的查询通常涉及遍历图的节点和关系,获取特定的路径。 - **模式(Schema)**:定义了节点、关系以及它们属性的数据类型和结构约束。 - **命名规则和建议(Naming...

    osg 数据处理最短的一帧

    - **关键概念解释**:包括视景器(Viewer)、场景树(Scene Graph)、相机(Camera)、事件遍历(Event Traversal)、更新遍历(Update Traversal)和渲染遍历(Rendering Traversals)等。 #### 数据处理核心流程解析 ##### ...

    Heyinsen#LeetcodeOrPat#1020 Tree Traversals (25 分) 后序和中序构建树1

    思路后序和中序构造二叉树唯一一个注意的地方,在注释中。// 注意这里是pos-right_num-1而不是想当然的pos_inr-1,这两个的位置并不一定对应。

    CPP数据结构和算法设计原则:利用现代C ++的功能来构建健壮和可扩展的应用程序

    在C++编程中,数据结构和算法的设计原则是构建高效、健壮且可扩展应用程序的基础。本主题将深入探讨如何利用现代C++的功能来实现这些目标。以下是一些关键的知识点,涵盖了标题和描述中提到的领域: ...

    pta题库答案c语言之树结构3TreeTraversalsAgain.zip

    本题库答案主要聚焦于树的遍历,特别是"Tree Traversals Again"这一主题,这通常涉及到深度优先搜索(DFS)和广度优先搜索(BFS)两种策略。 首先,我们要理解树的基本概念。树是由n(n&gt;=1)个有限节点组成一个具有...

    算法:经典算法和最知名算法的实现

    This repository contains various classic algorithms about ordenation, graph traversals, dynamic programing and some crypto related stuff as well. 在这个仓库中: - Peak finding (1D/2D) - Binary ...

    BinaryTree-traversals:React Application呈现二叉树遍历

    cd BinaryTree遍历 npm安装 npm开始 浏览到htpp:// localhost:3000 登陆页面 包含一棵静态树。 用户可以选择任何遍历(顺序,前顺序或后顺序),遍历的结果将显示在树下。 您也可以同时签出算法。 预购遍历 后...

    Binary_tree_order_traversals

    Binary_tree_order_traversals 在该项目中,我们可以看到树的顺序,前顺序和后顺序。 该程序将打开一个菜单,并允许用户通过一个接一个地导入数据(节点)来创建他/她的树: '''0。退出 插入 展示 搜索 为了 预购...

    数据结构英文教学课件:16_Trees_04.pdf

    1. **通用树遍历**(General Tree Traversals): - 预序遍历(Preorder Traversal):首先访问根节点,然后递归地对左子树进行预序遍历,最后遍历右子树。对于非二叉树,预序遍历依然适用,先访问根,再遍历其每个...

    浙江大学《数据结构》上课笔记 + 数据结构实现 + 课后题题解

    中国大学MOOC上浙大的《数据结构》广受好评,原因有二,一是基础,简单易懂,老师讲得也清楚,另一大优点就是配套的...Tree Traversals Again 树的遍历 中等 是否同一棵二叉搜索树 BST的建立与遍历 简单 Root of AVL T

    数据结构MOOC源代码

    Tree Traversals Again”可能包含树的不同遍历方法,如前序遍历、中序遍历和后序遍历,这些都是理解树结构的关键。 “05-图3. 六度空间 (30)”可能探讨社交网络中的人际连接,六度空间理论指出每个人与其他人之间...

    leetcode焦虑-Interview-Notes:采访笔记

    Tree traversals, search Stack Queue Graph traversals(BFS, DFS) 最短路径数学题 从之前的采访中吸取的错误和教训: 调度: 更加注意时间安排,在公司现场面试前保持2-3天的开放时间。 除非非常关键,否则不要立即...

    c(数据结构).

    4. Tree Traversals(树遍历):树遍历包括前序遍历(根-左-右)、中序遍历(左-根-右)和后序遍历(左-右-根)。这些遍历方法在操作树结构时非常有用,例如复制树、打印树、计算表达式树等。 5. Calculator_Stack...

    AccumuloGraphs:Accumulo的图算法实现

    2. **Traversals**:AccumuloGraphs中的核心操作,用于遍历图中的节点和边。开发者可以自定义traversal策略以适应不同的算法需求。 3. **Vertex**和**Edge**:图的基本元素,AccumuloGraphs中的Vertex和Edge类提供...

Global site tag (gtag.js) - Google Analytics