問題描述:非遞歸建立如下圖所示的二叉樹:
* 名 稱: 建立二叉樹(非遞歸)
* 作 者: 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語言描述》一
書有關二叉樹的一章,總算是找到了非遞歸建立的方法,故有如上的實現方法。