c语言实现按层次(广度优先)非递归遍历二叉链树

 1 #include<stdio.h>
 2 #include<conio.h> 4 #include<malloc.h>
 5 typedef char datatype;   //字符类型 内容
 6 typedef struct node{      //二叉链树数据结构
 7     datatype data;
 8     struct node *lchild,*rchild;
 9 }bitree;
10 bitree *CreatTree(){    //上一篇的建立二叉链树的函数和这里的一模一样,欢迎看上一篇的关于建立树的注释
11     char ch;
12     bitree *Q[100];
13     int front,rear;
14     bitree *root,*s;
15     root=NULL;
16     front=1,rear=0;
17     while((ch=getchar())!=‘#‘)
18     {
19         s=NULL;
20         if(ch!=‘@‘){
21             s=(bitree*)malloc(sizeof(bitree));
22             s->data=ch;
23             s->lchild=NULL;
24             s->rchild=NULL;
25         }
26         rear++;
27         Q[rear]=s;
28         if(rear==1)
29             root=s;
30         else{
31             if(s&&Q[front]){
32                 if(rear%2==0)
33                     Q[front]->lchild=s;
34                 else
35                     Q[front]->rchild=s;
36             }
37             if(rear%2==1)
38                 front++;
39         }
40     }
41     return root;
42 }
43 void BianLi(bitree *p){     //层次遍历二叉树的函数,其实和建立二叉树的思想很相似,都是用到下面的“队列数组”,p是要访问的树的根结点
44     bitree *Q[100];         //队列数组,存放bitree节点指针
45     bitree *s;              //当前遍历的节点
46     int rear=1,front=0;
47     Q[rear]=p;              //最先把头结点p入队
48     while(front<rear){      //队列数组不为空,则进入(继续)循环
49         front++;
50         s=Q[front];         //当前的节点入队
51         printf("%c",s->data); //访问元素
52         if(s->lchild!=NULL) //左孩子存在,则左孩子入队
53         {
54             rear++;
55             Q[rear]=s->lchild;
56         }
57         if(s->rchild!=NULL) //右孩子存在,则右孩子入队
58         {
59             rear++;
60             Q[rear]=s->rchild;
61         }
62     }
63 }
64 int main()
65 {
66     bitree *root;
67     root=CreatTree();
68     BianLi(root);
69     return 0;
70 }

也可以把结束提示符换到下一行输入:

时间: 2024-09-30 19:56:10

c语言实现按层次(广度优先)非递归遍历二叉链树的相关文章

c语言实现 非递归先序遍历二叉链树

1 #include<stdio.h> 2 #include<conio.h> 3 #include<malloc.h> 4 typedef char datatype; 5 typedef struct node{ 6 datatype data; 7 struct node *lchild,*rchild; 8 }bitree; //二叉链树数据结构定义 9 void Preorder(bitree *p) //先序遍历算法 10 { 11 bitree *Stac

数据结构:二叉树(前,中,后,层次)非递归遍历。

#include <iostream> #include <stack> #include <map> #include <queue> #include <string.h> using namespace std; struct Node { char data; Node *left; Node *right; Node(char d = char()):data(d),left(NULL),right(NULL){} }; class T

数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历

数据结构二叉树-- 编写函数实现:建立二叉树.中序递归遍历.借助栈实现中序非递归遍历.借助队列实现层次遍历.求高度.结点数.叶子数及交换左右子树. ("."表示空子树) #include<stdio.h> #include<stdlib.h> //***********二叉树链表节点结构 typedef char DataType; typedef struct Node {  DataType data;  struct Node*LChild;  struc

二叉树的非递归遍历C语言实现

腾讯面试中被问到二叉树的非递归遍历实现,当时记得不太清楚,回来专门复习了非递归的实现,整理代码如下: //采用二叉链表存储方式的二叉树,非递归中序遍历C语言实现代码 #include<stdio.h> #include <malloc.h> //函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 //Status是

二叉树之非递归遍历

1.二叉树的遍历 为什么要有遍历操作:将线性结构-------->非线性结构: 将递归程序-------->非递归程序: 2.二叉树的三种递归遍历: 先序遍历:先访问根(父)结点,在访问左分支,最后访问右分支: 中序遍历:先访问左分支,在根结点,最后右分支: 后序遍历:先访问左分支,在访问右分支,最后访问根节点: 所有程序皆正确测试过,后面将给完整程序和测试程序,测试结果. 以下就是递归遍历,先序,中序,后序: 下面的都是在类外定义的函数,所以为模板函数: //先序遍历 template<

重拾算法(1)——优雅地非递归遍历二叉树及其它

重拾算法(1)——优雅地非递归遍历二叉树及其它 本文中非递归遍历二叉树的思想和代码都来自这里(http://jianshu.io/p/49c8cfd07410#).我认为其思想和代码都足够优雅动人了,于是稍作整理,得到如下的程序. 前中后序遍历二叉树 1 public class BinaryTreeNode<T> 2 { 3 public T Value { get;set; } 4 public BinaryTreeNode<T> Parent { get;set; } 5 p

(源码,具体的细节请查阅相关资料)哈弗曼树的构造以及非递归遍历树

写了一点haffman树的创建和二叉树的非递归遍历. 如果编写代码的时候出现了,思维断点,可以借鉴一下, 避免浪费一些不必要的时间. 我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占 位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我 是占位符我是占位符我是占位符我是占位符我是占位符我是 占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符

树的递归与非递归遍历总结

树的递归遍历遍历很简单,非递归遍历要复杂一些,非递归先序.中序.后序遍历需要用一个辅助栈,而层次遍历则需要一个辅助队列. 树的结构: 1 public class Tree<T> { 2 private T data; 3 private Tree<T> left; 4 private Tree<T> right; 5 ... 6 } 用策略模式定义一个访问工具: 1 public interface Visitor<T> { 2 void process(

Java实现二叉树的创建、递归/非递归遍历

近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6.二叉树的递归后序遍历 7.二叉树的非递归后序遍历 8.二叉树的层次遍历 这里感谢博客http://blog.csdn.net/skylinesky/article/details/6611442的指导 /**二叉树的结点定义*/ class Node<T>{ private T value; pr