各种结构的结构体一定要写对呀,差一个*都不行
马上要去上课了,贴完代码就先跑路了

树 {数据,左右孩子指针}

上下都有名字,还有一个带*的

队列 {数据,next指针}

上下都有名字
还有一个队头队尾指针,下面有名字

栈{数据,top}

上下都有名字,一个总,一个分

#include<iostream>
using namespace std;
#define MAXSIZE 40//树
typedef struct Treenode {int data;struct Treenode* lchild, * rchild;
}Treenode,*Tree;//队列
typedef struct Linknode{Treenode* data;//辅助队列保存指针struct Linknode* next;
}Linknode;typedef struct {Linknode* front, * rear;
}Queue;//栈
typedef struct Stacknode {Treenode* data[MAXSIZE];int top;
}LiStack;//初始化树
void InitTree(Tree &T) {T = NULL;
}//建立有序二叉树
int bulid(Tree &T, int e) {if (T == NULL) {//当前结点为空T = new Treenode;T->data = e;T->lchild = NULL;T->rchild = NULL;return 0;}if (e < T->data) {//应插在左孩子bulid(T->lchild, e);}else {bulid(T->rchild, e);}return 0;
}void visit(Tree T) {cout << T->data << " ";
}//先序遍历树
void preorder(Tree T) {if (T != NULL) {visit(T);preorder(T->lchild);preorder(T->rchild);}
}void midorder(Tree T) {if (T!=NULL) {midorder(T->lchild);visit(T);midorder(T->rchild);}
}//初始化队列
void InitQueue(Queue& Q) {Q.front = Q.rear = NULL;
}//入队
void enQueue(Queue& Q, Tree T) {Linknode* p = new Linknode;p->data = T;p->next = NULL;if (Q.front == NULL) {Q.front = p;Q.rear = p;}else {Q.rear->next = p;Q.rear = p;}
}//出队
bool deQueue(Queue& Q,Tree &p) {if (Q.front == NULL) {cout << "空队列" << endl;return false;}else {p = Q.front->data;Q.front = Q.front->next;if (Q.front == NULL)//最后一个结点Q.rear = Q.front;return true;}
}//判空队列
bool empty(Queue Q) {if (Q.front == NULL)return true;return false;
}//层次遍历
void wide_order(Tree T) {Queue Q;InitQueue(Q);enQueue(Q, T);//根节点入队Tree p;while (!empty(Q)) {deQueue(Q, p);//这里有问题visit(p);if (p->lchild != NULL) {enQueue(Q, p->lchild);}if (p->rchild != NULL)enQueue(Q, p->rchild);}}//初始化栈
void InitStack(LiStack& S) {S.top = -1;
}//入栈
bool push(LiStack& S,Tree T) {if (S.top == MAXSIZE - 1) {return false;//满}else {S.data[++S.top] = T;return true;}
}//出栈
bool pop(LiStack& S, Tree& p) {if (S.top == -1)return false;else {p = S.data[S.top--];return true;}
}//判空栈
bool emptyStack(LiStack S) {if (S.top == -1)return true;return false;
}//非递归中序遍历
void mid_order(Tree T) {LiStack S;InitStack(S);Treenode* p = T;while (p || !emptyStack(S)) {if (p) {push(S, p);p = p->lchild;}else {pop(S, p);visit(p);p = p->rchild;}}
}int main() {Tree T;InitTree(T);bulid(T, 10);bulid(T, 20);bulid(T, 8);bulid(T, 22);bulid(T, 5);bulid(T, 9);bulid(T, 7);/*树结构:10/  \      8     20    / \    \5   9    22\7*/cout << "先序遍历:";preorder(T);cout << endl;//cout << Q.front->next->data->data;/*Queue Q;InitQueue(Q);Tree p;enQueue(Q, T);enQueue(Q, T->lchild);deQueue(Q, p);cout << p->data;deQueue(Q, p);cout << p->data;*/cout << "层次遍历:";wide_order(T);cout << endl;cout << "递归中序遍历:";midorder(T);cout << endl;cout << "非递归中序遍历:";mid_order(T);cout << endl;return 0;
}

23王道——层次遍历、非递归中序遍历相关推荐

  1. 非递归前序遍历二叉树,非递归中序遍历二叉树,非递归后续遍历二叉树

    import java.util.Stack;public class Front {//非递归前序遍历public void front(TreeNode node) {Stack<TreeN ...

  2. 数据结构之---非递归中序遍历二叉树

    二叉树中序非递归遍历算法实现 大家好,我是逝去的粒子,从今天起,我将尝试着数据结构从0开始学习分享,此篇文章作为试验,一方面可以为自己做笔记防止遗忘,另一方面希望可以帮助大家.不废话,正式开始. 1. ...

  3. 非递归中序遍历二叉树总结(2种方法)

    算法 非递归中序遍历二叉树总结(2种方法) @author:Jingdai @date:2020.12.03 传送门 非递归先序遍历二叉树 非递归后序遍历二叉树 方法1 先序遍历是第一次遇到该节点遍历 ...

  4. 二叉树非递归中序遍历

    二叉树的中序遍历 为什么把中序遍历放在最前面呢,因为在非递归遍历中,这个是最简单也是最容易理解的,所以放在第一个的位置. 中序遍历的递归算法很简单,但是想要非递归的实现,就要用到栈这个数据结构, 那么 ...

  5. 非递归中序遍历二叉树

    中序遍历二叉树(递归) void inOrder(BT* root) {if (root == NULL)return;inOrder(root->lchild);cout << & ...

  6. 无栈非递归中序遍历非线索化二叉树

    试设计一个非递归算法,按中根顺序遍历非线索二叉树,但不得用任何辅助. 在执行算法期间,允许改变LLINK和RLINK的值. 如何不用辅助栈非递归遍历二叉树呢? 这里给出了一个比较方便的算法,其基本思路 ...

  7. 不用栈实现二叉树非递归中序遍历

    偶尔看到这样一个问题: 有个二叉树,每个节点除了左右指针外,还有一个指向父节点的指针. 要求不用递归,中序遍历这棵树.另要求空间复杂度是O(1). 空间复杂度为O(1),摆明就是不让用堆栈模拟递归,所 ...

  8. LeetCode:二叉树的非递归中序遍历

    第一次动手写二叉树的,有点小激动,64行的if花了点时间,上传leetcode一次点亮~~~ 1 /* inorder traversal binary tree */ 2 #include < ...

  9. 非递归先序遍历二叉树总结(3种方法)

    算法 非递归先序遍历二叉树总结(3种方法) @author:Jingdai @date:2020.12.03 传送门 非递归中序遍历二叉树 非递归后序遍历二叉树 递归先序遍历二叉树非常的简单,但是面试 ...

  10. 二叉树非递归后序遍历算法

    与正常的非递归中序遍历算法不同于两点: 一  比正常的中序遍历算法多了对数据元素的标记. 在压数据元素入栈(标记记为0,用来表示访问了其左子树)时标记, 还有访问完左子树利用gettop()获取双亲通 ...

最新文章

  1. 【 English 】社会类高频词汇、固定搭配
  2. cv2.dnn读取模型报错
  3. day38--MySQL基础二
  4. 【数据中台】你的企业是否需要建设数据中台?
  5. 深度学习:向人工智能迈进
  6. Eureka深入理解
  7. Java中随机数的原理,以及使用时的注意点
  8. matconvnet在ubuntu15.10下配置和使用方法
  9. 云图说|初识云数据库GaussDB(for Redis)
  10. 在游戏设备上砸钱 其实小姐姐们更疯狂!
  11. 为信息产业自主化而奋斗,第一本龙芯平台的Linux内核书来了!
  12. 【大数据部落】IBM SPSS Modeler通过数据挖掘我们能从股市数据得到什么
  13. JS包含js文件 动态添加css
  14. 山东烟建借沟通CTBS实现财务数据大集中
  15. 44万条数据揭秘:如何成为网易云音乐评论区的网红段子手?
  16. .NET Standard中配置TargetFrameworks输出多版本类库
  17. 柯西过程(Cauchy process)
  18. ORAN C平面 Section Extension 5
  19. 2013-07-22 码市-武汉 返程票
  20. 追逐冠军的少年 | 算法工程师岗毕业三年总结

热门文章

  1. excel函数公式html文档,excel公式embed怎么用
  2. 微信自动发卡机器人说明
  3. sap 双计量单位_SAP 基本计量单位更改(转载)
  4. cdr软件百度百科_cdr是什么软件?
  5. POJ 3233 Matrix Power Series(java)
  6. 计算机病毒论文课题内容,计算机病毒防治学论文选题 计算机病毒防治论文题目怎样定...
  7. 为什么央行降息降准,会导致债券价格上涨?
  8. 【PS图像处理】修改图层中文字图形的颜色
  9. 乐鑫科技推出基于 ESP32-C3 的 Wi-Fi 单火线智能开关方案
  10. 第二十期 U-Boot添加web failsafe功能《路由器就是开发板》