最近学的二叉树,C代码

主要做记录,直接代码,理论以后再补吧

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#define ElemType char
#define STACK_DE 1
//the input can is :bef##d##cg##a##

char input_s[64] = {0};
int count = 0;


typedef struct node
{
	ElemType value;
	struct node * lchild;
	struct node * rchild;
}NODE;

//if not use recursion, use stack
typedef struct stack
{
	NODE * node;
	bool is_out;
	struct stack * next;
}STACK;
STACK * top = NULL;


static void push(NODE * node)
{
	STACK * t = (STACK * )malloc(sizeof(STACK));
	if(NULL == t)
		printf("error\n");
	t->node = node;
	
	t->next = top;
	top = t;
}

static void pop(NODE **node)
{
	if(top == NULL)
	{
		*node =  NULL;
	}
	STACK * stack = top;
	top = top->next;
	
	*node = stack->node;
	free(stack);
}

static bool is_stack_empty()
{
	if(top == NULL)
	{
		return true;
	}
	else{
		return false;
	}
}

static NODE * pro_create_tree(int layer)
{
	NODE * T;
	char ch;
	
	// printf("input\n");
	// scanf("%c",&ch);
	
	ch = input_s[count];
	count++;
	
	
	printf("get char %c\n",ch);
	if(ch == '#')
	{
		//printf("stop\n");
		return NULL;
	}
	setbuf(stdin,NULL);
	
	printf("start malloc\n");
	T = (NODE *)malloc(sizeof(NODE));
	if(NULL == T)
		printf("error\n");
	
	printf("layer = %d\n",layer);
	
	T->value = ch;
	T->lchild = pro_create_tree(layer + 1);
	T->rchild = pro_create_tree(layer + 1);
	
	return T;
}

//pro_traverse
static void pro_traverse(NODE * T)
{
	if(NULL == T)
		return;
	
	printf("%c ",T->value);
	
	pro_traverse(T->lchild);
	pro_traverse(T->rchild);
}
static void pro_traverse_s(NODE* T)
{
	NODE * temp= NULL;
	
	temp = T;
	
	while(temp != NULL || !is_stack_empty())
	{
		while(temp != NULL)
		{
			printf("%c ",temp->value);
			push(temp);
			temp = temp->lchild;
		}
		if(!is_stack_empty())
		{
			pop(&temp);
			temp = temp->rchild;
		}
	}
}

//mid traverse
static void in_traverse(NODE * T)
{
	if(NULL == T)
		return;
	in_traverse(T->lchild);
	printf("%c ",T->value);
	in_traverse(T->rchild);	
}
static void in_traverse_s(NODE * T)
{
	NODE * temp = T;
	while(temp != NULL || !is_stack_empty())
	{
		while(temp)
		{
			push(temp);
			temp = temp->lchild;
		}
		
		if(!is_stack_empty())
		{
			pop(&temp);
			printf("%c ",temp->value);
			temp = temp->rchild;
		}
	}
}

static void post_traverse(NODE * T)
{
	if(NULL == T)
		return;
	post_traverse(T->lchild);
	
	post_traverse(T->rchild);	
	printf("%c ",T->value);
}
static void post_traverse_s(NODE * T)
{
	NODE * temp = T;
	
	while(T || !is_stack_empty())
	{
		while(temp)
		{
			
		}
			
	}
}


int main(int argc, char *argv[])
{
	memcpy(input_s,argv[1],strlen(argv[1]));
	NODE * root = pro_create_tree(1);
	
	printf("ok\n");

	printf("pre_traverse:\n");
	pro_traverse(root);
	printf("\n");
	pro_traverse_s(root);
	printf("\n\n");
	
	printf("in_traverse:\n");
	in_traverse(root);
	printf("\n");
	in_traverse_s(root);
	printf("\n\n");
	
	printf("post_traverse:\n");
	post_traverse(root);
	printf("\n");

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值