先序和层序非递归算法C语言,c语言 二叉树的创建及其递归与非递归和层序遍历方法...

#include#include

#define MAXSIZE 20typedefstructnode{intdata;struct node*right;struct node*left;

}Node;

typedefstruct{

Node*root;

}Tree;

//二叉树的创建void insert(Tree *tree,intvalue)

{

Node*node=(Node *)malloc(sizeof(Node));

node->data=value;

node->left=NULL;

node->right=NULL;if(tree->root==NULL)

tree->root=node;else{

Node*temp=tree->root;while(temp!=NULL)

{if(valuedata)

{if(temp->left==NULL)

{

temp->left=node;break;

}elsetemp=temp->left;

}else{if(value>temp->data)

{if(temp->right==NULL)

{

temp->right=node;break;

}elsetemp=temp->right;

}

}

}

}

}//递归前序遍历法

void Preorder(Node *node)

{if(node!=NULL)

{

printf("%d",node->data);

Preorder(node->left);

Preorder(node->right);

}

}//递归的中序遍历

void Inorder(Node *node)

{if(node!=NULL)

{

Inorder(node->left);

printf("%d",node->data);

Inorder(node->right);

}

}//递归后序遍历法

void Postorder(Node *node)

{if(node!=NULL)

{

Postorder(node->left);

Postorder(node->right);

printf("%d",node->data);

}

}//非递归前序遍历方法

void PreorderNonrecurion(Node *node)

{if(node!=NULL)

{

Node*stack[MAXSIZE];int top=-1;

Node*p=NULL;

stack[++top]=node;while(top!=-1)

{

p=stack[top--];

printf("%d",p->data);if(p->right!=NULL)

stack[++top]=p->right;if(p->left!=NULL)

stack[++top]=p->left;

}

}

}//非递归中序遍历方法

void InorderNonrecurion(Node *node)

{if(node!=NULL)

{

Node*stack[MAXSIZE];int top=-1;

Node*p=node;while(top!=-1||p!=NULL)

{while(p!=NULL)

{

stack[++top]=p;

p=p->left;

}if(top!=-1)

{

p=stack[top--];

printf("%d",p->data);

p=p->right;

}

}

}

}//非递归后序遍历法

void PostorderNonrecurion(Node *node)

{if(node!=NULL)

{

Node*stack1[MAXSIZE];int top1=-1;

Node*stack2[MAXSIZE];int top2=-1;

stack1[++top1]=node;

Node*p=NULL;while(top1!=-1)

{

p=stack1[top1--];

stack2[++top2]=p;if(p->left!=NULL)

stack1[++top1]=p->left;if(p->right!=NULL)

stack1[++top1]=p->right;

}

Node*q=NULL;while(top2!=-1)

{

q=stack2[top2--];

printf("%d",q->data);

}

}

}//层次遍历

void Levelorder(Node *node)

{if(node!=NULL)

{

Node*que[MAXSIZE];int front=0,rear=0;

Node*p=NULL;

rear=(rear+1)%MAXSIZE;

que[rear]=node;while(front!=rear)

{

front=(front+1)%MAXSIZE;

p=que[front];

printf("%d",p->data);if(p->left!=NULL)

{

rear=(rear+1)%MAXSIZE;

que[rear]=p->left;

}if(p->right!=NULL)

{

rear=(rear+1)%MAXSIZE;

que[rear]=p->right;

}

}

}

}intmain(){int arr[7]={6,3,4,2,5,1,7};

Tree tree;

tree.root=NULL;for(int i=0;i<7;i++)

insert(&tree,arr[i]);

printf("递归前序遍历结果为");

Preorder(tree.root);

printf("");

printf("递归中序遍历结果为");

Inorder(tree.root);

printf("");

printf("递归后序遍历结果为");

Postorder(tree.root);

printf("");

printf("非递归前序遍历结果为");

PreorderNonrecurion(tree.root);

printf("");

printf("非递归中序遍历结果为");

InorderNonrecurion(tree.root);

printf("");

printf("非递归后序遍历结果为");

PostorderNonrecurion(tree.root);

printf("");

printf("层次遍历结果为");

Levelorder(tree.root);

printf("");

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值