树的递归和非递归遍历
来源:互联网 发布:php log日志 linux 编辑:程序博客网 时间:2024/05/18 17:25
#include <stdio.h>#include <stdlib.h>#include <iostream>#include <queue>#include <stack>using namespace std;typedef struct BiNode{ struct BiNode* lNode; struct BiNode* rNode; int data;}*BiTree;void createTree(BiTree &T){ int data; scanf("%d", &data); if (data == 0) { T = NULL; return; } T = (BiTree)malloc(sizeof(struct BiNode)); T->lNode = NULL; T->rNode = NULL; T->data = data; createTree(T->lNode); createTree(T->rNode);}void preOrder(BiTree T){ if (T == NULL) { return; } printf("%d ", T->data); preOrder(T->lNode); preOrder(T->rNode);}void inOrder(BiTree T){ if (T == NULL) { return; } inOrder(T->lNode); printf("%d ", T->data); inOrder(T->rNode);}void postOrder(BiTree T){ if (T == NULL) { return; } postOrder(T->lNode); postOrder(T->rNode); printf("%d ", T->data);}void levelOrder(BiTree T){BiNode* p;queue<BiNode*> Q;Q.push(T);while (!Q.empty()){p = Q.front();Q.pop();printf("%d ", p->data);if (p->lNode)Q.push(p->lNode);if (p->rNode)Q.push(p->rNode);}}/*前序非递归遍历树*/void preOrderTree(BiTree T){stack<BiNode*> S;BiNode* p = T;while (p!=NULL || !S.empty()){while (p != NULL){printf("%d ", p->data);S.push(p);p = p->lNode;}if (!S.empty()){p = S.top();S.pop();p = p->rNode;}}}/*中序非递归遍历树*/void inorderTree(BiTree T){stack<BiNode*> S;BiNode* p = T;while (p!=NULL || !S.empty()){/*左子树全部入栈*/while (p != NULL){S.push(p);p = p->lNode;}if (!S.empty()){p = S.top();S.pop();printf("%d ", p->data);p = p->rNode;}}}/*后序非递归遍历树*/void postOrderTree(BiTree T){stack<BiNode*> S;BiNode* p = T;BiNode* q = NULL;while (p!=NULL || !S.empty()){/*左子树全部入栈*/while (p != NULL){S.push(p);p = p->lNode;}if (!S.empty()){p = S.top();if (p->rNode==NULL || (p->rNode==q)){printf("%d ", p->data);q = p;S.pop();p = NULL; /*这个地方要置为空,否则会死循环*/}elsep = p->rNode;}}}int main(){ #if 1 BiTree T = NULL; createTree(T); printf("前序:\n"); preOrder(T);printf("\n非递归前序:\n");preOrderTree(T); printf("\n中序:\n"); inOrder(T);printf("\n非递归中序\n");inorderTree(T); printf("\n后序:\n"); postOrder(T);printf("\n非递归后序\n");postOrderTree(T); printf("\n层序:\n");levelOrder(T);printf("\n"); #endif return 0;}
0 0
- 树的递归和非递归遍历
- 树的递归遍历和非递归遍历源码(C++)
- 二叉树的递归遍历和非递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉搜索树的递归遍历和非递归遍历
- java 二叉树的递归遍历和非递归遍历
- 多叉树的递归和非递归遍历
- 多叉树的递归和非递归遍历
- 多叉树的递归和非递归遍历
- 多叉树的递归和非递归遍历
- 二叉树的递归和非递归的遍历算法
- 二叉树的前序中序后序的递归和非递归遍历
- 递归 和 非递归 遍历二叉树
- 递归和非递归遍历二叉树
- 递归和非递归遍历二叉树
- 二叉树递归和非递归遍历
- 二叉树递归和非递归遍历
- 递归和非递归遍历二叉树
- DBCP和JDBC学习总结(应用篇)
- xpath定位中starts-with、contains和text()的用法
- 简单vnc-server设置[centos6]
- 备考ocp_ORACLE专题之安装
- 避免创建不必要的SPWeb对象
- 树的递归和非递归遍历
- 级联检测器
- iOS 判断数组为空
- 谨慎使用String作为HashMap的Key
- 辛星整理Linux中的lvm
- 2015年学习计划让自己飞起来
- Vmware中安装Vmware Tools
- INFRASTRUCTURE TRACKING WITH PASSIVE MONITORING AND ACTIVE PROBING
- 如何用Maven手动添加Linux环境下的JZMQ依赖库