`
linest
  • 浏览: 157100 次
  • 性别: 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 登陆页面 包含一棵静态树。 用户可以选择任何遍历(顺序,前顺序或后顺序),遍历的结果将显示在树下。 您也可以同时签出算法。 预购遍历 后...

    c++数据结构的编程代码段

    11. Tree Traversals Again 12. Root of AVL Tree 13. Complete Binary Search Tree 14. 二叉搜索树的操作集 15. 堆中的路径 16. File Transfer 17. Huffman Codes 18. 列出连通集 19. Saving James Bond - Easy ...

    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