7-1 二叉树的层次遍历&6-9 二叉树的遍历 (层次遍历之队列)

7-1 二叉树的层次遍历 (25 分)
编写程序,要求实现(1)按先序遍历序列建立二叉树的二叉链表;(2)按层次遍历二叉树。

C++: 
构成二叉链表的结点类代码如下:
typedef struct BiNode
{            
        char data;                        //结点数据域
        struct BiNode *lchild,*rchild;    //左右孩子指针
}BiTNode,*BiTree;

按加入空树信息的先序遍历序列建立二叉树的二叉链表代码提供如下:
//先序遍历序列建立二叉链表
void CreateBiTree(BiTree &T)
{         
      char ch;
      cin >> ch;
      if(ch=='#')  T=NULL;            //递归结束,建空树
      else{                            
                 T=new BiTNode;
                 T->data=ch;                    //生成根结点
                 CreateBiTree(T->lchild);    //递归创建左子树
                 CreateBiTree(T->rchild);    //递归创建右子树
      }    //else
}                
Java: 
构成二叉链表的结点类代码如下:
class BtNode{
   char data;
   BtNode lchild,rchild;
}

按加入空树信息的先序遍历序列建立二叉树的二叉链表代码提供如下:
//先序遍历序列建立二叉链表
public static BtNode createBiTree() throws IOException{
   char c=(char) System.in.read();
   if(c=='#'){
      return null;
   }else{
      BtNode bt=new BtNode();
      bt.data=c;
      bt.lchild=createBiTree();
      bt.rchild=createBiTree();
      return bt;
   }
}

这里用c解题
输入格式:
输入一棵二叉树的加入空树信息的先序遍历序列,以#字符表示空树。

输出格式:
输出二叉树的层次遍历的序列。

输入样例:
ab#c##d##
输出样例:
abdc

#include <stdio.h>
#include <stdlib.h>
typedef struct BiNode
{            
    char data;                        //结点数据域
    struct BiNode *lchild,*rchild;    //左右孩子指针
}BiTNode,*BiTree;
typedef struct QNode{
	BiTree data;
	struct QNode *next;
}QNode, *QueuePrt;
typedef struct{
	QueuePrt front;
	QueuePrt rear;
}LinkQueue;

void InitQueue(LinkQueue &Q){
	Q.front = Q.rear = (QueuePrt)malloc(sizeof(QueuePrt));
	Q.front->next = NULL;
}
 
void EnQueue(LinkQueue &Q, BiTree q){
		QueuePrt p = (QueuePrt)malloc(sizeof(QueuePrt));
		p->data = q;
		p->next = NULL;
		Q.rear->next = p;
		Q.rear = p;
}

BiTree DeleteQueue(LinkQueue &Q, BiTree q){
	QueuePrt p;
	if(Q.front == Q.rear) return 0;
	p = Q.front->next;
	q = p->data;
	Q.front->next = p->next;
	if(Q.rear == p) Q.rear = Q.front;
	delete p;
	return q;  //返回树结点
}
//按加入空树信息的先序遍历序列建立二叉树的二叉链表代码提供如下:
//先序遍历序列建立二叉链表
void CreateBiTree(BiTree &T)
{       
      char ch;
      scanf("%c", &ch);
      if(ch=='#')  T=NULL;            //递归结束,建空树
      else{                            
                 T=new BiTNode;
                 T->data=ch;                    //生成根结点
                 CreateBiTree(T->lchild);    //递归创建左子树
                 CreateBiTree(T->rchild);    //递归创建右子树
      }   
}

void InOderTraverse(BiTree T){
	BiTree q;
	LinkQueue Q;
	InitQueue(Q);
	q = T; 
	EnQueue(Q, q);
	while(Q.front!=Q.rear){
		q = DeleteQueue(Q, q); 
		printf("%c", q->data);
		if(q->lchild) EnQueue(Q, q->lchild);
		if(q->rchild) EnQueue(Q, q->rchild);
	}
}
int main(){
	BiTree T;
	CreateBiTree(T);
	InOderTraverse(T);
}

用先序建立二叉树后
在这里插入图片描述

6-9 二叉树的遍历

本题要求给定二叉树的4种遍历。

函数接口定义:

void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );
``
其中BinTree结构定义如下:

```c
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

要求4个函数分别按照访问顺序打印出结点的内容,格式为一个空格跟着一个字符。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

BinTree CreatBinTree(); /* 实现细节忽略 */
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );

int main()
{
    BinTree BT = CreatBinTree();
    printf("Inorder:");    InorderTraversal(BT);    printf("\n");
    printf("Preorder:");   PreorderTraversal(BT);   printf("\n");
    printf("Postorder:");  PostorderTraversal(BT);  printf("\n");
    printf("Levelorder:"); LevelorderTraversal(BT); printf("\n");
    return 0;
}
/* 你的代码将被嵌在这里 */

输出样例(对于图中给出的树):
在这里插入图片描述

Inorder: D B E F A G H C I
Preorder: A B D F E C G H I
Postorder: D E F B H G I C A
Levelorder: A B C D F G I E H
void InorderTraversal( BinTree BT ){
    if(BT){
        //printf(" ");
        
        InorderTraversal(BT->Left);
		printf(" %c", BT->Data);
        InorderTraversal(BT->Right);
    }
}
void PreorderTraversal( BinTree BT ){
    if(BT){
        //printf(" ");
		printf(" %c", BT->Data);
        PreorderTraversal(BT->Left);
        PreorderTraversal(BT->Right);
      }
}
void PostorderTraversal( BinTree BT ){
    if(BT){
        //printf(" ");
        PreorderTraversal(BT->Left);
        PreorderTraversal(BT->Right);
        printf(" %c", BT->Data);
      }
}
void LevelorderTraversal( BinTree BT ){
    //模拟队列
    BinTree T, B[100];
    int front=0, rear=0;
    if(BT){
        B[rear++] = BT;
        while(front!=rear){
            T = B[front++];
            printf(" %c", T->Data);
            if(T->Left) B[rear++] = T->Left;
            if(T->Right) B[rear++] = T->Right;
        }
    }
}

因为不能再定义队列,所以用数组的方式模拟

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值