每日一题 --树的非递归遍历 20091017

问题描述 请实现二叉树的递归、非递归先序遍历。
问题分析 递归方法非常简单,非递归算法就是自己实现堆栈即可。
问题解答
#include <stdio.h>
#include <string.h>

typedef struct BinaryNode
{
    char num;
    struct BinaryNode* left;
    struct BinaryNode* right;
} BNode;

BNode* createTree(char* src,int len,int current)
{
    BNode* temp = malloc(sizeof(BNode*));
    temp->num = src[current];
    temp->left = NULL;
    temp->right = NULL;
    if (len > (2*current+1))
	temp->left = createTree(src,len,2*current+1);
    if (len > (2*current+2))
	temp->right = createTree(src,len,2*current+2);
    return temp;
}

int recurTravel(BNode* root) 
{
    if (root->left != NULL) recurTravel(root->left);
    printf("%c ",root->num);
    if (root->right != NULL) recurTravel(root->right);
    return 0;
}

int nonrecurTrav(BNode* root) 
{
    BNode * stack[100];
    int top = 0;
    stack[top++] = root;
    while (top > 0) 
    {
	while (stack[top-1]->left != NULL)
	{
	    stack[top] = stack[top-1]->left;
	    top++;
	}
	printf("%c ",stack[--top]->num);
	stack[top] = NULL;
	while (top>0 && stack[top-1]->right == NULL)  //注意top的越界
	{
	    printf("%c ",stack[--top]->num);
	    stack[top] = NULL;
	}
	if (top > 0)
	{
	    printf("%c ",stack[top-1]->num);
	    stack[top-1] = stack[top-1]->right;
	}
    }
    return 0;
}

int main() 
{
   char * src = "ABCDEFG";
   int len;
   BNode* btree;
   len = strlen(src);
   btree = createTree(src,len,0);
   recurTravel(btree);
   printf("\n");
   nonrecurTrav(btree);
   free(btree);
}



总结

其实这个算法本身并不复杂,恶心的是在实现的时候对C语言的内存地址的使用和恶心的MingW编译器(GCC),对指针操作不能越界

你可能感兴趣的:(C++,c,算法,C#,gcc)