二叉樹的非遞歸建立

問題描述:非遞歸建立如下圖所示的二叉樹:

 

 *  名 稱: 建立二叉樹(非遞歸)
 *  作 者: Brooke gao
 *  時 間: 2013/8/21
 *  
*/
	
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

#define STACKSIZE 50
#define bitree_size(tree)  ((tree)->size)   
#define bitree_root(tree)  ((tree)->root)
#define bitree_left(node)  ((node)->left)
#define bitree_right(node) ((node)->right)

/*
 *  定義二叉樹結點以及二叉樹的結構
 *
*/
typedef struct BiTreeNode_
{
	char data;
	struct BiTreeNode_ *left;
	struct BiTreeNode_ *right;
}BiTreeNode;

typedef struct BiTree_
{
	int size;
	BiTreeNode *root;
}BiTree;

/*
 *  定義棧的結構
 *
*/
typedef struct Stack_
{
	BiTreeNode * base[STACKSIZE];
	int top;
	int stacksize;
}Stack;

void stack_init(Stack *stack)
{
	stack->top = -1;
	stack->stacksize = 0;
}

void push(Stack *stack, BiTreeNode *node)
{
	if(stack->stacksize == STACKSIZE)
		exit(-1);

	stack->base[++stack->top] = node;
	stack->stacksize++;
}

int stack_empty(Stack *stack)
{
	if((-1 == stack->top) && (0 == stack->stacksize))
		return 1;
	else
		return 0;
}

BiTreeNode* pop(Stack *stack)
{
	if(stack->top < 0)
		exit(-1);
	else
	{
		stack->stacksize--;
		return stack->base[stack->top--];
	}
}

BiTreeNode* get_stack_top(Stack *stack)
{
	if(stack->top < 0)
		exit(-1);
	return stack->base[stack->top];
}

void bitree_init(BiTree *tree)
{
	tree->size = 0;
	tree->root = NULL;
}

//給樹tree的某個結點node插入數據域爲data的左子樹
int bitree_ins_left(BiTree *tree, BiTreeNode *node, const char data)
{
	BiTreeNode *new_node, **position;

	if(NULL == node)
	{
		if(bitree_size(tree) > 0)
			return -1;
		position = &tree->root;
	}
	else
	{
		if(bitree_left(node) != NULL)
			return -1;
		position = &node->left;
	}

	if( NULL == (new_node = (BiTreeNode *)malloc(sizeof(BiTreeNode))) )
		return -1;
	new_node->data = data;
	new_node->left = NULL;
	new_node->right = NULL;
	*position = new_node;
	tree->size++;
		
	return 0;
}

//給樹tree的某個結點node插入數據域爲data的右子樹
int bitree_ins_right(BiTree *tree, BiTreeNode *node, const char data)
{
	BiTreeNode *new_node, **position;

	if(NULL == node)
	{
		if(bitree_size(tree) > 0)
			return -1;

		position = &tree->root;
	}
	else
	{
		if(bitree_right(node) != NULL)
			return -1;

		position = &node->right;
	}

	if( NULL == (new_node = (BiTreeNode *)malloc(sizeof(BiTreeNode))) )
		return -1;

	new_node->data = data;
	new_node->left = NULL;
	new_node->right = NULL;

	*position = new_node;

	tree->size++;
	return 0;
}

// 先序遍歷函數
void pre_order(const BiTreeNode *node)
{
	if(node)
	{
		printf("%c",node->data);
		pre_order(node->left);
		pre_order(node->right);
	}
}

// 中序遍歷函數
void in_order(const BiTreeNode *node)
{
	if(node)
	{
		in_order(node->left);
		printf("%c",node->data);
		in_order(node->right);
	}
}

// 後序遍歷函數
void end_order(const BiTreeNode *node)
{
	if(node)
	{
		end_order(node->left);
		end_order(node->right);
		printf("%c",node->data);
	}
}

int main()
{
	char data;
	Stack stack;
	BiTree tree;
	BiTreeNode *node;
	
	stack_init(&stack);
	bitree_init(&tree);

	printf("請以先序順序輸入結點值: \n");

	data = getchar();
	
	if( 0 == bitree_size(&tree) )
	{
		if( ' ' == data )
			return -1;
		bitree_ins_left(&tree,NULL,data);
		push(&stack,tree.root);
	}
	while(!stack_empty(&stack))
	{
		data = getchar();

		if( ' ' == data )
		{
			node = pop(&stack);
			
			if(NULL == node->left)
			{
				data = getchar();
				if( ' ' != data )
				{
					bitree_ins_right(&tree,node,data);
					push(&stack,node->right);
				}
			}
		}
		else
		{
			node = get_stack_top(&stack);
			if( NULL == node->left )
			{
				bitree_ins_left(&tree,node,data);
				push(&stack,node->left);
			}
			else
			{
				node = pop(&stack);
				bitree_ins_right(&tree,node,data);
				push(&stack,node->right);
			}
		}
	}
	printf("-----先序遍歷二叉樹-----\n");
	pre_order(tree.root);
	putchar('\n');
	
	printf("-----中序遍歷二叉樹-----\n");
	in_order(tree.root);
	putchar('\n');

	printf("-----後序遍歷二叉樹-----\n");
	end_order(tree.root);
	putchar('\n');

	return 0;
}

 

運行結果:

注:

最近複習到樹一章,發現嚴蔚敏的《數據結構》一書關於二叉樹的建立只有遞歸算法,而沒有非遞歸算法。

但想着只要是遞歸能實現的非遞歸一定能實現,所以昨天開始試着自己看能不能寫出來,但折騰了老半天

還是錯誤百出,最後乾脆沒頭緒了。後來在網上找了一下,用非遞歸建立二叉樹的很少,僅有的幾個思路不

是很清晰且有些運行起來有些問題。今天經@zhao4zhong1老師的推薦,看了《算法精解--C語言描述》一

書有關二叉樹的一章,總算是找到了非遞歸建立的方法,故有如上的實現方法。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章