二叉树的遍历是二叉数应用的一个基础。而其遍历的方法可以分为递归和非递归,递归遍历相对来说比较简单,本人在另一篇博文中有详细介绍,此文将以前序非递归遍历为例子,给大家展示非递归遍历
其基本思想既创建一个栈以存储数据域的值,以便二叉树的遍历 。
#include <stdio.h>
#include <stdlib.h>
/*
定义二叉树结点的类型
*/
typedef struct node {
int date;
struct node * left, *right;
}BTnode;
//创建一个二叉树
BTnode * CreateBTtree(int A[], int n)
{
BTnode *root, *c, *pa, *p;
root = (BTnode*)malloc(sizeof(BTnode));
root->date = A[0];
root->left = root->right = NULL;
for (int i = 1; i < n; i++)
{
p = (BTnode*)malloc(sizeof(BTnode));
p->date = A[i];
p->left = p->right = NULL;
c = root;
while (c != NULL)
{
pa = c;
if (c->date > p->date)
c = c->left;
else
c = c->right;
}
if (pa->date > p->date)
pa->left = p;
else
pa->right = p;
}
return root;
}
/*
前序遍历二叉树(先访问根节点,再访问左子树,最后访问右子树)(递归遍历)
*/
void Forder(BTnode*root)
{
if (root)
{
printf("%d ", root->date);
Forder(root->left);
Forder(root->right);
}
}
/*
二叉树的非递归前序遍历
*/
void Forde_2(BTnode* root)
{
BTnode **s;
int top = -1;
BTnode *p;
//创建一个栈
s = (BTnode**)malloc(9 * sizeof(BTnode*));
//初始化栈
s[++top] = root;
//进行非递归遍历
while (top != -1)
{
p = s[top--];
printf("%d ", p->date);
if (p->right)
s[++top] = p->right;
if (p->left)
s[++top] = p->left;
}
free(s);
}
int main(void)
{
int A[9] = { 7,5,3,4,9,6,8,1,2 };
BTnode * root;
//创建二叉搜索树
root = CreateBTtree(A, 9);
//前序遍历二叉搜索树(递归)
Forder(root);
printf("\n");
//前序遍历二叉搜索树(非递归)
Forde_2(root);
printf("\n");
return 0;
}