C语言非递归实现二叉树的先序、中序、后序、层序遍历

C语言非递归实现二叉树的先序、中序、后序、层序遍历代码如下:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <stack>
  4 #include <queue>
  5 using namespace std;
  6
  7 //*****二叉树的二叉链表存储表示*****//
  8 typedef struct BiNode
  9 {
 10     char data;
 11     struct BiNode *lchild, *rchild;
 12     int visitCount;
 13 }BiNode, *BiTree;
 14
 15 //*****按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树构造二叉链表表示的二叉树T*****//
 16 void CreateBiTree(BiTree &T)
 17 {
 18     char ch;
 19     scanf("%c", &ch);
 20     if(ch == ‘ ‘)
 21     {
 22         T = NULL;
 23     }
 24     else
 25     {
 26         if(!(T = (BiNode *)malloc(sizeof(BiNode))))
 27         {
 28             return;
 29         }
 30         T->data = ch;                            //生成根结点
 31         T->lchild = NULL;
 32         T->rchild = NULL;
 33         CreateBiTree(T->lchild);                //构造左子树
 34         CreateBiTree(T->rchild);                //构造右子树
 35     }
 36
 37     return;
 38 }
 39
 40 //*****先序遍历二叉树*****//
 41 void PreOrderTraverse(BiTree T)
 42 {
 43     stack<BiTree> TreeStack;
 44     BiTree p = T;
 45
 46     while (p || !TreeStack.empty())
 47     {
 48         if (p)
 49         {
 50             printf("%c ", p->data);
 51             TreeStack.push(p);
 52             p = p->lchild;
 53         }
 54         else
 55         {
 56             p = TreeStack.top();
 57             TreeStack.pop();
 58             p = p->rchild;
 59         }
 60     }
 61 }
 62
 63 //*****中序遍历二叉树*****//
 64 void InOrderTraverse(BiTree T)
 65 {
 66     stack<BiTree> TreeStack;
 67     BiTree p = T;
 68
 69     while (p || !TreeStack.empty())
 70     {
 71         if (p)
 72         {
 73             TreeStack.push(p);
 74             p = p->lchild;
 75         }
 76         else
 77         {
 78             p = TreeStack.top();
 79             printf("%c ", p->data);
 80             TreeStack.pop();
 81             p = p->rchild;
 82         }
 83     }
 84 }
 85
 86 //*****后序遍历二叉树*****//
 87 void PostOrderTraverse(BiTree T)
 88 {
 89     stack<BiTree> TreeStack;
 90     BiTree p = T;
 91
 92     while (p || !TreeStack.empty())
 93     {
 94         if (p)
 95         {
 96             p->visitCount = 1;
 97             TreeStack.push(p);
 98             p = p->lchild;
 99         }
100         else
101         {
102             p = TreeStack.top();
103             TreeStack.pop();
104             if (p->visitCount == 2)
105             {
106                 printf("%c ", p->data);
107                 p = NULL;
108             }
109             else
110             {
111                 p->visitCount++;
112                 TreeStack.push(p);
113                 p = p->rchild;
114             }
115         }
116     }
117 }
118
119 //*****层序遍历二叉树*****//
120 void LevelOrderTraverse(BiTree T)
121 {
122     if (!T)
123     {
124         return;
125     }
126
127     queue<BiTree> TreeQueue;
128     TreeQueue.push(T);
129     BiTree p = T;
130     while (!TreeQueue.empty())
131     {
132         p = TreeQueue.front();
133         TreeQueue.pop();
134         printf("%c ", p->data);
135
136         if (p->lchild)
137         {
138             TreeQueue.push(p->lchild);
139         }
140         if (p->rchild)
141         {
142             TreeQueue.push(p->rchild);
143         }
144     }
145 }
146
147 int main(void)
148 {
149     BiTree T;
150     printf("请按先序次序输入二叉树中结点的值(字符),空格字符表示空树:\n");
151     CreateBiTree(T);
152
153     printf("先序遍历结果为:");
154     PreOrderTraverse(T);
155     printf("\n\n");
156
157     printf("中序遍历结果为:");
158     InOrderTraverse(T);
159     printf("\n\n");
160
161     printf("后序遍历结果为:");
162     PostOrderTraverse(T);
163     printf("\n\n");
164
165     printf("层序遍历结果为:");
166     LevelOrderTraverse(T);
167     printf("\n\n");
168
169     return 0;
170 }

以如下二叉树为例,给出按先序次序输入二叉树中结点的值(字符),从而按照本文给出的算法构造二叉树。

输入字符的顺序是:-+a空格空格*b空格空格-c空格空格d空格空格/e空格空格f空格空格,即可验证本文提供的遍历算法。

时间: 2024-10-06 00:16:22

C语言非递归实现二叉树的先序、中序、后序、层序遍历的相关文章

C语言非递归实现二叉树的先序、中序、后序遍历

1 #include <stdio.h> 2 #include <stdlib.h> 3 #define INIT_STACK_SIZE 100 4 #define STACKINCREMENT 10 5 6 //*****二叉树的二叉链表存储结构*****// 7 typedef struct BiNode 8 { 9 char data; 10 struct BiNode *lchild, *rchild; 11 int visitcount; //访问次数(后序遍历会用到)

非递归求二叉树的前序、中序和后序遍历

一.前序遍历 分析: 1.前序遍历是中左右,因此利用栈,记录栈顶根结点的同时,先压右子树,后压左子树,从而先遍历左子树. 2.每次弹出的栈顶结点符合前序遍历的顺序,因此可直接记录. 3.注意:由于压入栈的是树的结点,所以栈内数据类型为Node*. struct Node{ int val; Node *left, *right; }; vector<int> get_preorder(Node *root){ vector<int> preorder; stack<Node*

leetcode(144,94,145,102)中迭代版的二叉树的前、中、后、层级遍历

//前序遍历class Solution{ public: vector<int> preorderTraversal(TreeNode *root){ vector<int> res; stack<TreeNode*> s; TreeNode* p = root; if(!p) return res; s.push(p); while(!s.empty()){ p = s.top(); s.pop(); res.push_back(p->val); if(p-&

Java数据结构四之——二叉树的前、中、后序遍历

程序来自Program Creek 前 Preorder binary tree traversal is a classic interview problem about trees. The key to solve this problem is to understand the following: What is preorder? (parent node is processed before its children) Use Stack from Java Core lib

二叉树非递归先中后序遍历 及 非递归交换二叉树两个孩子的位置

看到一个非递归交换一个二叉树的左右孩子的位置,于是想实现之,才发现非递归的先中后序遍历都忘记了……于是杂七杂八的写了一些,抄抄资料就实现了,然后实现非递归交换两个孩子的位置还是相当容易的.先直接上代码吧,其实这东西还是得自己写写过一遍的,印象才会更加深刻: #include <iostream> #include <fstream> #include <string> #include <stack> using std::cout; using std::

非递归实现二叉树的遍历(前序、中序、后序)

树的定义本是递归定义,所以采用递归的方法实现遍历算法,更加让人理解,且代码简单方便.若采用非递归的方法实现,须得利用栈模拟实现. 栈的特点(后进先出) 非递归实现二叉树的前序遍历: 原理如图所示: 参考代码如下: void _PrevOrder(Node* root)//非递归实现前序遍历 { stack<Node*> s; if(root == NULL) return; s.push(root); while (!s.empty()) { root = s.top(); cout<&

算法进化历程之“根据二叉树的先序和中序序列输出后序序列”

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 前不久在看到一个作业"根据二叉树的先序和中序序列输出后序序列",当时我参考<数据结构与算法(C语言)习题集>上的做法,先根据先中序序列确定一颗二叉树,然后后序遍历二叉树输出后序序列. 函数采用了递归算法,利用函数传入的先序和中序序列的左右边界,确定要处理的序列段,生成相应的二叉树. 基本思路是,把该段先序序列的第一个元素作为当前二叉树的根结点,然后在中序序列找到根结点.根结点

先序序列和后序序列并不能唯一确定二叉树

数据结构的基础知识中重要的一点就是能否根据两种不同遍历序列的组合(有三种:先序+中序,先序+后序,中序+后序),唯一的确定一棵二叉树.然后就是根据二叉树的不同遍历序列(先序.中序.后序),重构二叉树.显然,这三种组合并不是都能唯一确定二叉树的,其中先序+后序就不能唯一确定一棵二叉树,其他两种组合可以唯一的确定一颗二叉树. 由先序序列和后序序列不能唯一确定一棵二叉树,因无法确定左右子树两部分. 反例:任何结点只有左子树的二叉树和任何结点只有右子树的二叉树,其前序序列相同,后序序列相同,但却是两棵不

通过二叉树的中序序列和后序序列获取前序序列

二叉树的遍历方式常见的三种是:先序遍历(ABC).中序遍历(BAC).后序遍历(BCA) 先序遍历: 若二叉树为空,则空操作:否则: 访问根结点; 先序遍历左子树: 先序遍历右子树. 中序遍历: 若二叉树为空,则空操作:否则: 中序遍历左子树: 访问根结点: 中序遍历右子树. 后序遍历: 若二叉树为空,则空操作:否则: 后序遍历左子树: 后序遍历右子树: 访问根结点. 在学习到 根据遍历序列确定二叉树 时,知道了:可以通过二叉树的先中或者中后遍历序列唯一确定一棵二叉树. 根据算法描述 使用jav