8606 二叉树的构建及遍历操作

时间限制:1000MS  内存限制:1000K

题型: 编程题   语言: 无限制

描述

构造二叉链表表示的二叉树:按先序次序输入二叉树中结点的值(一个字符),‘#‘字符表示空树,构造二叉链表表示的二叉树T;再输出三种遍历序列。本题只给出部分代码,请补全内容。

#include "stdio.h"

#include "malloc.h"

#define TRUE 1

#define FALSE 0

#define OK  1

#define ERROR  0

#define INFEASIBLE -1

#define OVERFLOW -2

typedef int  Status;

typedef char  ElemType;

typedef struct BiTNode{

ElemType data;

struct BiTNode *lchild,*rchild;//左右孩子指针

} BiTNode,*BiTree;

Status CreateBiTree(BiTree &T) {  // 算法6.4

// 按先序次序输入二叉树中结点的值(一个字符),’#’字符表示空树,

// 构造二叉链表表示的二叉树T。

char ch;

scanf("%c",&ch);

if (ch==‘#‘) T = NULL;

else {

if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;

________________________ // 生成根结点

_______________________   // 构造左子树

_________________________  // 构造右子树

}

return OK;

} // CreateBiTree

Status PrintElement( ElemType e ) {  // 输出元素e的值

printf("%c", e );

return OK;

}// PrintElement

Status PreOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) {

// 前序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。

//补全代码,可用多个语句

} // PreOrderTraverse

Status InOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) {

// 中序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。

//补全代码,可用多个语句

} // InOrderTraverse

Status PostOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) {

// 后序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。

//补全代码,可用多个语句

} // PostOrderTraverse

int main()   //主函数

{

//补充代码

}//main

输入格式

第一行:输入一棵二叉树的先序遍历序列

输出格式

第一行:二叉树的先序遍历序列

第二行:二叉树的中序遍历序列

第三行:二叉树的后序遍历序列

输入样例

AB##C##

输出样例

ABC

BAC

BCA

答案:

/*构造二叉链表表示的二叉树:按先序次序输入二叉树中结点的值(一个字符),‘#‘字符表示空树,

构造二叉链表表示的二叉树T;再输出三种遍历序列。本题只给出部分代码,请补全内容。*/

#include "stdio.h"

#include "malloc.h"

#define TRUE 1

#define FALSE 0

#define OK  1

#define ERROR  0

#define INFEASIBLE -1

#define OVERFLOW -2

typedef int  Status;

typedef char  ElemType;

typedef struct BiTNode{

ElemType data;

struct BiTNode *lchild,*rchild;//左右孩子指针

} BiTNode,*BiTree;

Status CreateBiTree(BiTree &T) {  // 算法6.4

// 按先序次序输入二叉树中结点的值(一个字符),’#’字符表示空树,

// 构造二叉链表表示的二叉树T。

char ch;

scanf("%c",&ch);

if (ch==‘#‘) T = NULL;

else {

if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;

T->data=ch; // 生成根结点

CreateBiTree(T->lchild);   // 构造左子树

CreateBiTree(T->rchild);  // 构造右子树

}

return OK;

} // CreateBiTree

Status PrintElement( ElemType e ) {  // 输出元素e的值

printf("%c", e );

return OK;

}// PrintElement

Status PreOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) {

// 前序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。

//补全代码,可用多个语句

if(T)

{

if(Visit(T->data))

if(PreOrderTraverse(T->lchild,Visit))

if(PreOrderTraverse(T->rchild,Visit))

return OK;

return ERROR;

}

else return OK;

} // PreOrderTraverse

Status InOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) {

// 中序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。

//补全代码,可用多个语句

if(T)

{

if(InOrderTraverse(T->lchild ,Visit))

if(Visit(T->data))

if(InOrderTraverse(T->rchild,Visit))

return OK;

return ERROR;

}

else return OK;

} // InOrderTraverse

Status PostOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) {

// 后序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。

//补全代码,可用多个语句

if(T)

{

if(PostOrderTraverse(T->lchild,Visit))

if(PostOrderTraverse(T->rchild,Visit))

if(Visit(T->data))

return OK;

return ERROR;

}

else return OK;

} // PostOrderTraverse

int main()   //主函数

{

BiTree T;//补充代码

CreateBiTree(T);

PreOrderTraverse(  T, PrintElement);

printf("\n");

InOrderTraverse(T,PrintElement);

printf("\n");

PostOrderTraverse(T,PrintElement );

printf("\n");

return 0;

}//main

时间: 2024-12-12 16:42:42

8606 二叉树的构建及遍历操作的相关文章

Java实现二叉树的创建和遍历操作(有更新)

博主强烈建议跳过分割线前面的部分,直接看下文更新的那些即可. 最近在学习二叉树的相关知识,一开始真的是毫无头绪.本来学的是C++二叉树,但苦于编译器老是出故障,于是就转用Java来实现二叉树的操作.但是二者原理是一致的,而且实现的方式也是大同小异! 下面就让我们来看看代码吧. 1.首先我们需要创建一个二叉树的节点类,便于我们对树的操作,当然了,你也可以在二叉树类的内部将节点类声明为内部类,但是这样会降低操作的灵活性.我才用的是单独创建一个BinaryTreeNode类,代码如下: package

Java实现二叉树的构建与遍历

转载:http://ocaicai.iteye.com/blog/1047397 目录: 1.把一个数组的值赋值给一颗二叉树 2.具体代码 1.树的构建方法 2.具体代码 Java代码   package tree; import java.util.LinkedList; import java.util.List; /** * 功能:把一个数组的值存入二叉树中,然后进行3种方式的遍历 * * 参考资料0:数据结构(C语言版)严蔚敏 * * 参考资料1:http://zhidao.baidu.

线索二叉树的构建和遍历------小甲鱼数据结构和算法

#include <stdio.h> #include <stdlib.h> typedef char ElemType; // 线索存储标志位 // Link(0):表示指向左右孩子的指针 // Thread(1):表示指向前驱后继的线索 typedef enum {Link, Thread} PointerTag; typedef struct BiThrNode { char data; struct BiThrNode *lchild,*rchild; PointerTag

java实现二叉树的构建以及3种遍历方法

转载自http://ocaicai.iteye.com/blog/1047397 大二下学期学习数据结构的时候用C介绍过二叉树,但是当时热衷于java就没有怎么鸟二叉树,但是对二叉树的构建及遍历一直耿耿于怀,今天又遇见这个问题了,所以花了一下午的时间来编写代码以及介绍思路的文档生成! 目录: 1.把一个数组的值赋值给一颗二叉树 2.具体代码 1.树的构建方法 2.具体代码 Java代码   package tree; import java.util.LinkedList; import jav

java实现二叉树的构建以及3种遍历方法(转)

转 原地址:http://ocaicai.iteye.com/blog/1047397 大二下学期学习数据结构的时候用C介绍过二叉树,但是当时热衷于java就没有怎么鸟二叉树,但是对二叉树的构建及遍历一直耿耿于怀,今天又遇见这个问题了,所以花了一下午的时间来编写代码以及介绍思路的文档生成! 目录: 1.把一个数组的值赋值给一颗二叉树 2.具体代码 1.树的构建方法 2.具体代码 Java代码   package tree; import java.util.LinkedList; import 

二叉树的前中后序递归和非递归遍历操作【代码】

“遍历”是二叉树各种操作的基础,可以在遍历过程中对节点进行各种操作,如:求节点的双亲,求节点的孩子,判断节点的层次,当然,还有一些更重要的操作,例如,依据遍历序列建立二叉树,,再如,对建立的二叉树进行线索化,等等. 二叉树的各种遍历操作必须了然于心,无论是递归的,还是非递归的.递归算法的优点是形式简单,当然,正如一句话所说“迭代是人,递归是神.”递归算法的整个详细过程还是很烧脑的,每一步都把未知当作已知,每一步又在把未知变为已知.想不到描述起来又用上了递归的概念,生活中其实有很多递归的现象,我印

DS二叉树—二叉树构建与遍历(不含框架)

题目描述 给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘#’表示,例如AB#C##D##),建立该二叉树的二叉链式存储结构,并输出该二叉树的先序遍历.中序遍历和后序遍历结果. 输入 第一行输入一个整数t,表示有t个二叉树 第二行起输入每个二叉树的先序遍历结果,空树用字符‘#’表示,连续输入t行. 输出 输出每个二叉树的先序遍历.中序遍历和后序遍历结果. 样例输入 2 AB#C##D## AB##C## 样例输出 ABCD BCAD CBDA ABC BAC BCA 提示 #inc

数据结构之二叉树的构建C++版

二叉树的构建要注意与链式表的区别,二叉树这里的构建十分低级,每个树只是构建了一个单一的二叉树节点,总体来看是有下向上构建的.用户需要手动去构建自己需要的树,而不是直接去插入数据就到二叉树中了,因为不是链式结构的单一,二叉树十分丰富的. 提一下遍历: 迭代的方式遍历十分简单.先序.中序.后序遍历都只是针对根节点.比如中序,就是先遍历左子树-->根节点-->右子树.(根节点在中间) /* 1) 树的基本概念: 度:说白了就是节点拥有的子分支数 叶子节点:说白了就是度为0的节点 双亲:说白了就是父亲

二叉树的性质和常用操作代码集合

二叉树的性质和常用操作代码集合 性质: 二叉树的性质和常用代码操作集合 性质1:在二叉树的第i层上至多有2^i-1个结点 性质2:深度为k的二叉树至多有2^k - 1个结点 性质3:对任意一棵二叉树T,若终端结点数为n0,而其度数为2的结点数为n2,则n0 = n2 + 1 满二叉树:深度为k且有2^-1个结点的树 完全二叉树:深度为k,结点数为n的二叉树,如果其结点1~n的位置序号分别与等高的满二叉树的结 点1~n的位置序号一一对应,则为完全二叉树. 性质4:具有n的结点的完全二叉树深度为lo