数据结构_二叉树遍历

#include<stdlib.h>
#include<stdio.h>
#define MAX  50
#define MAS  20
#define CHAR 1typedef char elem;
//定义二叉树的数据结构
typedef struct node{elem data;//二叉树的值struct node *lchild;    //左孩子struct node *rchild;//右孩子struct node *parent;//父节点
}BinTNode,*BinTree;
//定义二叉树的初始化函数
BinTNode *Init_BinTree(BinTNode *tree){tree=NULL; //将NULL赋值给treereturn tree; //返回tree
}
//创建二叉树
BinTNode *Create_BinTree(BinTNode *tree){elem ch;scanf("%c",&ch);            //将键入值赋给二叉树的节点if(ch==' ')                    // 以空格作为空左孩子和空右孩子的表示tree=NULL;else{        //申请空间,以及通过对左右孩子的递归完成二叉树的创建tree=(BinTNode *)malloc(sizeof(BinTNode));if(!tree) exit(0);tree->data=ch; tree->parent=NULL;tree->lchild=Create_BinTree(tree->lchild);if(tree->lchild) tree->lchild->parent=tree;tree->rchild=Create_BinTree(tree->rchild);if(tree->rchild) tree->rchild->parent=tree;}return tree;//返回tree
}//在屏幕上输出创建的二叉树,采用递归算法
void PrintTree(BinTNode *tree,int i){if(tree!=NULL){                  //采用条件编译对CHAR事先进行编译PrintTree(tree->rchild,i+5);#if CHARif(tree->data!=' ')printf("%*c\n",i,tree->data);#elseif(tree->data!=' ')printf("%*d\n",i,tree->data);#endifPrintTree(tree->lchild,i+5);i=i-5;}
}/*先序遍历(递归)*/
void  Pre_Order(BinTNode *tree){if(tree!=NULL){printf("%c"" ",tree->data);Pre_Order(tree->lchild);Pre_Order(tree->rchild);}
}/*中序遍历(递归)*/
void In_Order(BinTNode *tree){if(tree!=NULL){In_Order(tree->lchild);printf("%c"" ",tree->data);In_Order(tree->rchild);}
}
//中序遍历(非递归),利用栈结构存储数据
void In_OrderX(BinTNode *tree,void(*visit)(elem)){BinTNode *p,*stack[MAS];int top;top=0;  p=tree;while(top!=0||p!=NULL){while(p!=NULL){stack[top]=p; top++;p=p->lchild;}if(top!=0){p=stack[top-1];top--;visit(p->data);p=p->rchild;}}
}
/*后序遍历(递归)*/
void Bac_Order(BinTNode *tree){if(tree!=NULL){Bac_Order(tree->lchild);Bac_Order(tree->rchild);printf("%c"" ",tree->data);}
}
/*后序遍历(非递归),利用栈结构存储数据   */
void Bac_OrderX(BinTNode *tree,void(*visit)(elem)){BinTNode *p,*stack[MAS];int top;top=0;stack[top]=tree; top++;while(top>0){p=stack[top-1]; top--;while(p!=NULL){visit(p->data);stack[top]=p->rchild;top++;p=p->lchild;}}
}void visit(elem e){printf("%c"" ",e);
}int main()
{ int i;BinTree tree;tree=Init_BinTree(tree);#if CHARprintf("请先序输入二叉树(如:abc  d  e  ):");#elseprintf("请先序输入二叉树(如:a b    表示a为根结点,b为左子树的二叉树)\n");#endiftree=Create_BinTree(tree);printf("输入建立的二叉树!!!\n");PrintTree(tree,5);do{printf("------------------------------------------------------------");printf("\n 主菜单:");printf("\n  1  先序遍历(递归)");printf("\n  2  中序遍历(递归)");printf("\n  3  中序遍历(非递归)");printf("\n  4  后序遍历(递归)");printf("\n  5  后序遍历(非递归)");//    printf("\n  6                  ");printf("\n  0    退出");printf("\n----------------------------------------------------------");printf("\n");printf("亲,请输入功能数字:");scanf("%d",&i);switch(i){case 1: printf("先序遍历(递归)结果为:");Pre_Order(tree); break;case 2: printf("中序遍历(递归)结果为:");In_Order(tree); break;case 3: printf("中序遍历(非递归)结果为:");In_OrderX(tree,visit) ;  break;case 4:    printf("后序遍历(递归)结果为:");Bac_Order(tree); break;case 5: printf("后序遍历(非递归)结果为:");Bac_Order(tree,visit); break;case 0: exit(0);default :printf("亲,请输入--菜单--中的功能数字!");}printf("\n \n");}while(i>0||i<8);return 0;
}

 

课题二

一、   目的

二叉树的遍历算法实现

二、   实习环境

个人计算机,Windows操作系统,Visual C++6.0编译开发环境

三、   实习内容、步骤与要求

遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。

递归算法的算法实现:

先序遍历:

若二叉树非空,则依次执行如下操作:

(1) 访问根结点;(2) 遍历左子树;(3) 遍历右子树。

中序遍历:

若二叉树非空,则依次执行如下操作:

(1)遍历左子树; (2)访问根结点;(3)遍历右子树。

后序遍历:

若二叉树非空,则依次执行如下操作:

(1)遍历左子树;(2)遍历右子树;(3)访问根结点。

非递归算法的实现:

中序遍历:

  对于任一结点P,

  1)若其左孩子不为空,则将P入栈并将P的左孩子置为当前的P,然后对当前结点P再进行相同的处理;

  2)若其左孩子为空,则取栈顶元素并进行出栈操作,访问该栈顶结点,然后将当前的P置为栈顶结点的右孩子;

  3)直到P为NULL并且栈为空则遍历结束

后序遍历:

要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。

1)         如果P不存在左孩子和右孩子,则可以直接访问它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。

2)         若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。

 

四:源程序:

#include<stdlib.h>

#include<stdio.h>

#define MAX  50

#define MAS  20

#define CHAR 1

 

typedef char elem;

//定义二叉树的数据结构

typedef struct node{

    elem data;//二叉树的值

     struct node *lchild;    //左孩子

     struct node *rchild;//右孩子

     struct node *parent;//父节点

}BinTNode,*BinTree;

//定义二叉树的初始化函数

BinTNode *Init_BinTree(BinTNode *tree){

     tree=NULL; //将NULL赋值给tree

     return tree; //返回tree

}

//创建二叉树

BinTNode *Create_BinTree(BinTNode *tree){

    elem ch;

    scanf("%c",&ch);         //将键入值赋给二叉树的节点

     if(ch==' ')                // 以空格作为空左孩子和空右孩子的表示

       tree=NULL;

     else{        //申请空间,以及通过对左右孩子的递归完成二叉树的创建

       tree=(BinTNode *)malloc(sizeof(BinTNode));

        if(!tree)

           exit(0);

      tree->data=ch;

      tree->parent=NULL;

      tree->lchild=Create_BinTree(tree->lchild);

      if(tree->lchild)

         tree->lchild->parent=tree;

      tree->rchild=Create_BinTree(tree->rchild);

      if(tree->rchild)

         tree->rchild->parent=tree;

     }

     return tree;//返回tree

}

  //在屏幕上输出创建的二叉树,采用递归算法

void PrintTree(BinTNode *tree,int i){

    if(tree!=NULL){                  //采用条件编译对CHAR事先进行编译

       PrintTree(tree->rchild,i+5);

    #if CHAR

       if(tree->data!=' ')

       printf("%*c\n",i,tree->data);

    #else

       if(tree->data!=' ')

       printf("%*d\n",i,tree->data);

    #endif

       PrintTree(tree->lchild,i+5);

       i=i-5;

    }

}

 

/*先序遍历(递归)*/

void  Pre_Order(BinTNode *tree){

    if(tree!=NULL){

       printf("%c"" ",tree->data);

       Pre_Order(tree->lchild);

       Pre_Order(tree->rchild);

    }

}

 

 

/*中序遍历(递归)*/

void In_Order(BinTNode *tree){

    if(tree!=NULL){

       In_Order(tree->lchild);

       printf("%c"" ",tree->data);

       In_Order(tree->rchild);

    }

}

//中序遍历(非递归),利用栈结构存储数据

void In_OrderX(BinTNode *tree,void(*visit)(elem)){

    BinTNode *p,*stack[MAS];

    int top;

    top=0;  p=tree;

    while(top!=0||p!=NULL){

       while(p!=NULL){

           stack[top]=p; top++;

           p=p->lchild;

        }

       if(top!=0){

           p=stack[top-1];

           top--;

           visit(p->data);

           p=p->rchild;

       }

    }

}

/*后序遍历(递归)*/

void Bac_Order(BinTNode *tree){

    if(tree!=NULL){

       Bac_Order(tree->lchild);

       Bac_Order(tree->rchild);

       printf("%c"" ",tree->data);

    }

}

/*后序遍历(非递归),利用栈结构存储数据   */

void Bac_OrderX(BinTNode *tree,void(*visit)(elem)){

    BinTNode *p,*stack[MAS];

    int top;

    top=0;

    stack[top]=tree; top++;

    while(top>0){

       p=stack[top-1];

       top--;

       while(p!=NULL){

           visit(p->data);

           stack[top]=p->rchild;

           top++;

           p=p->lchild;

       }

    }

}

 

void visit(elem e){

    printf("%c"" ",e);

}

 

 

int main()

{

    int i;

    BinTree tree;

    tree=Init_BinTree(tree);

    #if CHAR

       printf("请先序输入二叉树(如:abc  d  e  ):");

    #else

       printf("请先序输入二叉树(如:a b    表示a为根结点,b为左子树的二叉树)\n");

    #endif

    tree=Create_BinTree(tree);

    printf("输入建立的二叉树!!!\n");

    PrintTree(tree,5);

    do{

       printf("------------------------------------------------------------");

       printf("\n 主菜单:");

       printf("\n  1  先序遍历(递归)");

       printf("\n  2  中序遍历(递归)");

       printf("\n  3  中序遍历(非递归)");

       printf("\n  4  后序遍历(递归)");

       printf("\n  5  后序遍历(非递归)");

    //  printf("\n  6                  ");

       printf("\n  0    退出");

       printf("\n----------------------------------------------------------");

       printf("\n");

       printf("亲,请输入功能数字:");

       scanf("%d",&i);

       switch(i){

           case 1: printf("先序遍历(递归)结果为:");

                  Pre_Order(tree); break;

           case 2: printf("中序遍历(递归)结果为:");

                  In_Order(tree); break;

            case 3: printf("中序遍历(非递归)结果为:");

                  In_OrderX(tree,visit) ;  break;

           case 4:    printf("后序遍历(递归)结果为:");

                  Bac_Order(tree); break;

           case 5: printf("后序遍历(非递归)结果为:");

                  Bac_Order(tree,visit); break;

           case 0: exit(0);

           default :printf("亲,请输入--菜单--中的功能数字!");

       }

    printf("\n \n");

    }

    while(i>0||i<8);

    return 0;

}

 

转载于:https://www.cnblogs.com/askDing/p/KE.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 文件编辑器,用于Linux的文本编辑器(除了Vi)?

用于Linux的文本编辑器(除了Vi)&#xff1f;首先&#xff0c;我说我在Mac OSX上使用TextMate来满足我的文本需求&#xff0c;因此我对此表示喜欢。 在Linux平台上有什么可比的吗&#xff1f; 我将主要使用它来编码python / ruby。谷歌搜索产生过时的答案。编辑&#xff1a;由于…

python 接口 、继承、重载运算符

文章目录1. 序列__getitem__2. __setitem__3. 抽象基类4. 不要直接子类化内置类型5. 继承顺序6. 重载运算符learn from 《流畅的python》 1. 序列__getitem__ 如果没有 __iter__ 和 __contains__ 方法&#xff0c; Python 会调用 __getitem__ 方法&#xff0c; 设法让 迭代 和…

LeetCode meituan-007. 小团的选调计划(模拟)

文章目录1. 题目2. 解题1. 题目 美团打算选调 n 名业务骨干到 n 个不同的业务区域&#xff0c;本着能者优先的原则&#xff0c;公司将这 n 个人按照业务能力从高到底编号为 1~n 。 编号靠前的人具有优先选择的权力&#xff0c;每一个人都会填写一个意向&#xff0c;这个意向是…

linux webservice端口号,解决在Linux环境下访问webservice发送中文乱码问题的方案

首先&#xff0c;看在windows环境下正常显示中文的原因&#xff1a;打开cmd窗口&#xff0c;输入&#xff1a;chcp你会发现输出活动代码页: 936查阅936的意义&#xff1a;它指明了当前系统使用的编码&#xff0c;936 代表GBK 扩展的EUC-CN 编码( GB 2312-80编码,包含 6763 个汉…

LeetCode 1973. Count Nodes Equal to Sum of Descendants(DFS)

文章目录1. 题目2. 解题1. 题目 Given the root of a binary tree, return the number of nodes where the value of the node is equal to the sum of the values of its descendants. A descendant of a node x is any node that is on the path from node x to some leaf …

linux server.xml日志参数,Linux Log4j+Kafka+KafkaLog4jAppender 日志收集

背景&#xff1a;kafka版本&#xff1a;kafka_2.10-0.8.2.1服务器IP&#xff1a;10.243.3.17一&#xff1a;Kafkaserver.properties 文件配置二&#xff1a;zookeeper.properties 文件配置三&#xff1a; zookeeper,kafka启动../bin/zookeeper-server-start.sh -daemon /usr/lo…

LeetCode 1966. Binary Searchable Numbers in an Unsorted Array

文章目录1. 题目2. 解题1. 题目 Consider a function that implements an algorithm similar to Binary Search. The function has two input parameters: sequence is a sequence of integers, and target is an integer value. The purpose of the function is to find if t…

12 哈希表相关类——Live555源码阅读(一)基本组件类

12 哈希表相关类——Live555源码阅读(一)基本组件类 这是Live555源码阅读的第一部分&#xff0c;包括了时间类&#xff0c;延时队列类&#xff0c;处理程序描述类&#xff0c;哈希表类这四个大类。 本文由乌合之众 lym瞎编&#xff0c;欢迎转载 http://www.cnblogs.com/oloroso…

将方法作为方法的参数 —— 理解委托

《.NET开发之美》上对于委托写到&#xff1a;“它们就像是一道槛儿&#xff0c;过了这个槛的人&#xff0c;觉得真是太容易了&#xff0c;而没有过去的人每次见到委托和事件就觉得心里别得慌&#xff0c;混身不自在。”我觉得这句话就像是在说我自己一样。于是我决定好好看看关…

unix架构

UNIX Kernel&#xff08;UNIX内核&#xff09;&#xff1a;指挥机器的运行&#xff0c;控制计算机的资源 UNIX Shell(UNIX外壳&#xff09;&#xff1a;是UNIX内核和用户的接口&#xff0c;是UNXI的命令解释器。目前常用的Shell有3种Bourne Shell(B Shell): 命令sh。最老。Korn…

randn函数加噪声_语义分割中常用的损失函数1(基础篇)

一、L1、L2 loss (分割中不常用&#xff0c;主要用于回归问题)L1 LossL1 Loss 主要用来计算 input x 和 target y 的逐元素间差值的平均绝对值.pytorch表示为&#xff1a;torch.nn.functional.l1_loss(input, target, size_averageTrue)size_average主要是考虑到minibatch的情况…

LeetCode MySQL 1607. 没有卖出的卖家

文章目录1. 题目2. 解题1. 题目 表: Customer ------------------------ | Column Name | Type | ------------------------ | customer_id | int | | customer_name | varchar | ------------------------customer_id 是该表主键. 该表的每行包含网上商城的每一位…

LeetCode MySQL 1623. 三人国家代表队

文章目录1. 题目2. 解题1. 题目 表: SchoolA ------------------------ | Column Name | Type | ------------------------ | student_id | int | | student_name | varchar | ------------------------student_id 是表的主键 表中的每一行包含了学校A中每一个学…

LeetCode MySQL 1633. 各赛事的用户注册率

文章目录1. 题目2. 解题1. 题目 用户表&#xff1a; Users ---------------------- | Column Name | Type | ---------------------- | user_id | int | | user_name | varchar | ----------------------user_id 是该表的主键。 该表中的每行包括用户 ID 和用户…

LeetCode MySQL 1747. 应该被禁止的Leetflex账户

文章目录1. 题目2. 解题1. 题目 表: LogInfo ----------------------- | Column Name | Type | ----------------------- | account_id | int | | ip_address | int | | login | datetime | | logout | datetime | -----------------------该表是…

linux vim配置c,Linux入门学习教程:GNU C及将Vim打造成C/C++的半自动化IDE

C语言在Linux系统中的重要性自然是无与伦比、不可替代&#xff0c;所以我写Linux江湖系列不可能不提C语言。C语言是我的启蒙语言&#xff0c;感谢C语言带领我进入了程序世界。虽然现在不靠它吃饭&#xff0c;但是仍免不了经常和它打交道&#xff0c;特别是在Linux系统下。Linux…

LeetCode MySQL 1661. 每台机器的进程平均运行时间

文章目录1. 题目2. 解题1. 题目 表: Activity ------------------------- | Column Name | Type | ------------------------- | machine_id | int | | process_id | int | | activity_type | enum | | timestamp | float | --------------…

LeetCode MySQL 1741. 查找每个员工花费的总时间

文章目录1. 题目2. 解题1. 题目 表: Employees ------------------- | Column Name | Type | ------------------- | emp_id | int | | event_day | date | | in_time | int | | out_time | int | -------------------(emp_id, event_day, in_time) 是这个表…

LeetCode MySQL 1777. 每家商店的产品价格(行列转换)

文章目录1. 题目2. 解题1. 题目 表&#xff1a;Products ---------------------- | Column Name | Type | ---------------------- | product_id | int | | store | enum | | price | int | ----------------------(product_id,store) 是这个表的…

记事本linux命令换行符,Windows 10版记事本应用终于支持Linux/Mac换行符 排版不再辣眼睛...

记事本(Notepad)是微软 Windows 操作系统中相当经典的一款工具&#xff0c;其在最新的 Windows 10 操作系统中也得到了保留&#xff0c;命运比被 Photos 和 Paint 3D 取代的画图(MsPaint)程序要好得多。不过最近&#xff0c;Windows10 版记事本应用迎来了一项技能更新&#xff…