树的各种遍历方法

树的各种遍历方法

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
const int maxn = 1e5 + 10;
int sum=0;
//树的各种遍历方法

typedef struct tree *tramp;
struct tree{
    char data;
    struct tree *left;
    struct tree *right; 
};//树

typedef struct SNode* Stack;
struct SNode {
	tramp data;
	struct SNode* next;
};//栈

typedef struct 
{
    tramp data[maxn];
    int rear;
    int front;  
}Queue;//队列

tramp createTree()//建树
{
	tramp tree;
	char str;
	str = getchar();
	if(str == '#'){
		tree = NULL;
	}else{
		tree = (tramp)malloc(sizeof(tree));
		tree->data = str;
		tree->left = createTree();
		tree->right = createTree();
	}
	return tree;
}

Stack MakeStack()//建栈
{
  Stack ptrl;
  ptrl=(Stack)malloc(sizeof(struct SNode));
  ptrl->next=NULL;
  return ptrl;
} 

Queue* MakeQueue()//建队列
{
  Queue* Q=(Queue*)malloc(sizeof(Queue));
  Q->front=0;
  Q->rear=0;
  return Q;
}

int IsEmpty(Stack s)//判断栈是否为空
{
      if(s->next==NULL)
        return (1);
      else
        return(0);
}     

void push(Stack p, tramp s)//入栈
{
	Stack  ptrl;
	ptrl = (Stack)malloc(sizeof(struct SNode));
	ptrl->data = s;
	ptrl->next = p->next;
	p->next = ptrl;
}

void pop(Stack p,tramp &s)//出栈
{
	Stack  ptrl;
	int item;
	if (IsEmpty(p)) {
		printf("堆栈空");
	}
	else {
		ptrl = p->next;
        s=ptrl->data;
		p->next = ptrl->next;
		free(ptrl);
	}
}

void AddQ(Queue *PtrlQ,tramp item)//入队列
{
     if(PtrlQ->rear+1==maxn){
      printf("the Queue is full");
      return ;
      }
      PtrlQ->rear=PtrlQ->rear+1;
      PtrlQ->data[PtrlQ->rear]=item;
}

tramp DeleteQ ( Queue *PtrQ )//出队列
{
       if ( PtrQ->front == PtrQ->rear ) {
             printf("队列空");
             return NULL;
       }  else  {
            PtrQ->front = PtrQ->front+1;
            return  PtrQ->data[PtrQ->front];
       }
}

int isEmpty( Queue *PtrlQ )//队列是否为空
{
  if(PtrlQ->front == PtrlQ->rear) return 0;
  else return 1;
}

int isFull( Queue *PtrlQ )//队列是否为满
{
  if(PtrlQ->rear+1==maxn) return 0;
  else return 1;
}

void perOrder(tramp T)//先序
{
    if(T!=NULL){
        printf("%c",T->data);
        perOrder(T->left);
        perOrder(T->right);
        }
}

void inOrder(tramp T)//中序
{
    if(T!=NULL){
        inOrder(T->left);
        printf("%c",T->data);
        inOrder(T->right);
        }
}

void postOrder(tramp T)//后序
{
    if(T!=NULL){
        postOrder(T->left);
        postOrder(T->right);
        printf("%c",T->data);
        }
}

void iterInorder( tramp BT )//迭代中序
{	
  tramp T=BT;
  Stack S = MakeStack(); 
  while( T || !IsEmpty(S) ){
    while(T){	
      push(S,T);
      T = T->left;
    }
    if(!IsEmpty(S)){
       pop(S,T); 
       printf("%c", T->data); 
       T = T->right; 
      }
  }
}

void LevelOrder( tramp BT )//层次遍历
{
  Queue* Q=MakeQueue();
  tramp T;
  if ( !BT )  return; 
  AddQ( Q, BT );
  while ( isEmpty(Q)==1  ) {
    T = DeleteQ( Q );
    printf("%c", T->data); 
    if ( T->left )  AddQ( Q, T->left );
    if ( T->right )  AddQ( Q, T->right );
  }
}

void Leaves(tramp BT )//叶数  
{
 
  if( BT ) {
  if ( !BT->left && !BT->right )
    sum++;  
  Leaves ( BT->left );  
  Leaves ( BT->right );
}
}

int height(tramp tree)//深度
{
	int h1,h2;
	if(tree == NULL){
		return 0;
	}else{
		h1 = height(tree->left);
		h2 = height(tree->right);
		if(h1>h2){
			return h1+1;
		}else{
			return h2+1;
		}
	}
}

int main(){
    tramp tree;
    tree = createTree();
	int i=0;
	int l=1,treeHeight,treeCount;

	treeHeight = height(tree);
	printf("\ntreeHeight: %d\n",treeHeight);
	
    Leaves(tree);
    printf("leaf: %d\n",sum);

	printf("perOrder: ");
	perOrder(tree);
	printf("\n");
 
	printf("inOrder: ");
	inOrder(tree);
	printf("\n");
 
	printf("postOrder: ");
	postOrder(tree);
	printf("\n");

    printf("iterInorder: ");
	iterInorder(tree);
	printf("\n");

    printf("LevelOrder: ");
	LevelOrder(tree);
	printf("\n");

  
    system("pause");
    return 0;
}
//ABD#G###CE##FH###
测试驱动的编程是 XP 困扰程序员的一个方面。对于测试驱动的编程意味着什么以及如何去做,大多数人都做出了不正确的假设。这个月,XP 方面的讲师兼 Java 开发人员 Roy Miller 谈论了测试驱动的编程是什么,它为什么可以使程序员的生产力和质量发生巨大变化,以及编写测试的原理。请在与本文相随的 论坛中提出您就本文的想法,以飨笔者和其他读者。(您也可以单击本文顶部或底部的“讨论”来访问该论坛。) 最近 50 年来,测试一直被视为项目结束时要做的事。当然,可以在项目进行之中结合测试测试通常并不是在 所有编码工作结束后才开始,而是一般在稍后阶段进行测试。然而,XP 的提倡者建议完全逆转这个模型。作为一名程序员,应该在编写代码 之前编写测试,然后只编写足以让测试通过的代码即可。这样做将有助于使您的系统尽可能的简单。 先编写测试 XP 涉及两种测试: 程序员测试和 客户测试测试驱动的编程(也称为 测试为先编程)最常指第一种测试,至少我使用这个术语时是这样。测试驱动的编程是让 程序员测试(即单元测试 ― 重申一下,只是换用一个术语)决定您所编写的代码。这意味着您必须在编写代码之前进行测试测试指出您 需要编写的代码,从而也 决定了您要编写的代码。您只需编写足够通过测试的代码即可 ― 不用多,也不用少。XP 规则很简单:如果不进行程序员测试,则您不知道要编写什么代码,所以您不会去编写任何代码。 测试驱动开发(TDD)是极限编程的重要特点,它以不断的测试推动代码的开发,既简化了代码,又保证了软件质量。本文从开发人员使用的角度,介绍了 TDD 优势、原理、过程、原则、测试技术、Tips 等方面。 背景 一个高效的软件开发过程对软件开发人员来说是至关重要的,决定着开发是痛苦的挣扎,还是不断进步的喜悦。国人对软件蓝领的不屑,对繁琐冗长的传统开发过程的不耐,使大多数开发人员无所适从。最近兴起的一些软件开发过程相关的技术,提供一些比较高效、实用的软件过程开发方法。其中比较基础、关键的一个技术就是测试驱动开发(Test-Driven Development)。虽然TDD光大于极限编程,但测试驱动开发完全可以单独应用。下面就从开发人员使用的角度进行介绍,使开发人员用最少的代价尽快理解、掌握、应用这种技术。下面分优势,原理,过程,原则,测试技术,Tips等方面进行讨论。 1. 优势 TDD的基本思路就是通过测试来推动整个开发的进行。而测试驱动开发技术并不只是单纯的测试工作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值