先序遍历(递归)

1 void preOrderTraverase(TreeNode * r)
2 {
3 if(r)
4 {
5 printf("%d\t",r->_data);
6 preOrderTraverase(r->_left);
7 preOrderTraverase(r->_right);
8 }
9 }

中序遍历(递归)

1 void midOrderTraverase(TreeNode * r)
2 {
3 if(r)
4 {
5 midOrderTraverase(r->_left);
6 printf("%d\t",r->_data);
7 midOrderTraverase(r->_right);
8 }
9 }

后序遍历(递归)

1 void postOrderTraverase(TreeNode * r)
2 {
3 if(r)
4 {
5 postOrderTraverase(r->_left);
6 postOrderTraverase(r->_right);
7 printf("%d\t",r->_data);
8 }
9 }

层序遍历(用到队列)(递归)

 1 void levelOrderTraverse(TreeNode *root)
2 {
3 if(root)
4 {
5 Queue q;
6 initQueue(&q);
7 enQueue(&q,root);
8 while(!isQueueEmpty(&q))
9 {
10 root = deQueue(&q); //根出队
11 printf(" %d ",root->data);
12 if(root->left)enQueue(&q,root->left); //左子树入队
13 if(root->right)enQueue(&q,root->right);//右子树入队
14 }
15 printf("\n");
16 }
17 }

先序遍历(非递归)

 1 void preOrderTraverase(TreeNode * r)
2 {
3 if(r)
4 {
5 Stack s;
6 initStack(&s);
7 while(r || !isStackEmpty(&s)) //第一次循环或者栈内不空
8 {
9 while(r)
10 {
11 printf("%d\t",r->_data);//访问结点
12 push(&s,r);
13 r = r->_left; //一直向左并将沿途结点压入堆栈
14 }
15 if(!isStackEmpty(&s))
16 {
17 r = pop(&s); //结点弹出堆栈
18 r = r->_right; //转向右子树
19 }
20 }
21 }
22 }

中序遍历(非递归)

 1 void midOrderTraverase(TreeNode * r)
2 {
3 if(r)
4 {
5 Stack s;
6 initStack(&s);
7 while(r || !isStackEmpty(&s))
8 {
9 while(r)
10 {
11 push(&s,r);
12 r = r->_left;
13 }
14 if(!isStackEmpty(&s))
15 {
16 r = pop(&s);
17 printf("%d\t",r->_data);//访问的时机变了
18 r = r->_right;
19 }
20 }
21 }
22 }

后序遍历(非递归)

 
对于任一节点 P,
1.将节点 P 入栈;
2.若 P 不存在左孩子和右孩子,或者 P 存在左孩子或右孩子,但左右孩子已经被输出,
则可以直接输出节点 P,并将其出栈,将出栈节点 P 标记为上一个输出的节点,再将此时的栈顶结点设为当前节点;
3.若不满足2中的条件,
则将 P 的右孩子和左孩子依次入栈,当前节点重新置为栈顶结点,之后重复操作2;
4.直到栈空,遍历结束。

 1 void postOrderTraverse(struct Tree *t)
2 {
3 Stack s; initStack(&s);
4 TreeNode *cur; //当前结点
5 TreeNode *pre=NULL; //前一次访问的结点
6 push(&s,t);
7 while(!isStackEmpty(&s))
8 {
9 cur = pop(&s);
10 push(&s,cur);
11 if((cur->_left==NULL&&cur->_right==NULL)|| (pre!=NULL&&(pre==cur->_left||pre==cur->_right)))
12 { //如果当前结点没有孩子结点或者孩子节点都已被访问过
13 printf("%d\t",cur->_data);
14 pop(&s);
15 pre=cur;
16 }
17 else
18 {
19 if(cur->_right != NULL)
20 push(&s,cur->_right);
21 if(cur->_left != NULL)
22 push(&s,cur->_left);
23 }
24 }
25 }
 

树的遍历c/c++的更多相关文章

  1. 数据结构--树(遍历,红黑,B树)

    平时接触树还比较少,写一篇博文来积累一下树的相关知识. 很早之前在数据结构里面学的树的遍历. 前序遍历:根节点->左子树->右子树 中序遍历:左子树->根节点->右子树 后序遍 ...

  2. YTU 3023: 树的遍历

    原文链接:https://www.dreamwings.cn/ytu3023/2617.html 3023: 树的遍历 时间限制: 1 Sec  内存限制: 128 MB 提交: 3  解决: 2 题 ...

  3. 团体程序设计天梯赛-练习集L2-006. 树的遍历

    L2-006. 树的遍历 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历 ...

  4. leetcode404-----简单的树的遍历

    Find the sum of all left leaves in a given binary tree. Example: 3 / \ 9 20 / \ 15 7 There are two l ...

  5. pat L2-006. 树的遍历

    L2-006. 树的遍历 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历 ...

  6. L2-006. 树的遍历

    题目链接:L2-006. 树的遍历 今天一神给我手敲二叉树模板,瞬间就领悟了,感觉自己萌萌哒! 看上去很直观! #include <iostream> #include <cstdi ...

  7. js实现对树深度优先遍历与广度优先遍历

    深度优先与广度优先的定义 首先我们先要知道什么是深度优先什么是广度优先. 深度优先遍历是指从某个顶点出发,首先访问这个顶点,然后找出刚访问这个结点的第一个未被访问的邻结点,然后再以此邻结点为顶点,继续 ...

  8. L2-006 树的遍历 (25 分) (根据后序遍历与中序遍历建二叉树)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456 L2-006 树的遍历 (25 分 ...

  9. 团体程序设计天梯赛 L2-006. 树的遍历 L2-011. 玩转二叉树

    L2-006. 树的遍历 #include <stdio.h> #include <stdlib.h> #include <string.h> #include & ...

  10. L2-006 树的遍历 (后序中序求层序)

    题目: 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数.第二行给出其后序遍历序 ...

随机推荐

  1. 源码剖析ThreadPoolExecutor线程池及阻塞队列

    本文章对ThreadPoolExecutor线程池的底层源码进行分析,线程池如何起到了线程复用.又是如何进行维护我们的线程任务的呢?我们直接进入正题: 首先我们看一下ThreadPoolExecuto ...

  2. Word 脚本 (自用)

    打开开发工具 右击功能区->自定义功能区 勾选开发工具->确定 导入代码 开发工具选项卡->Visual Basic 右击Normal->插入->模块 粘贴代码-> ...

  3. Windows环境下Robot Framework 下载及安装流程

    1.安装包下载 注意安装包统一64位或32位 1)python-2.7.16.amd64.msi 2)robotframework-3.0.2.tar.gz 3)robotframework-ride ...

  4. 01、mysql安装配置

    1.下载mysql软件安装包 MySQL版本:5.7.17 mysql下载地址:http://rj.baidu.com/soft/detail/12585.html?ald 2.配置mysql数据库与 ...

  5. [Golang]-7 定时器和打点器

    目录 定时器 打点器 After()方法 我们常常需要在未来某个时刻运行 Go 代码,或者在某段时间间隔内重复运行. Go 的内置 定时器 和 打点器 特性让这些很容易实现. 定时器 type Tim ...

  6. woj1012 Thingk and Count DP好题

    title: woj1012 Thingk and Count DP好题 date: 2020-03-12 categories: acm tags: [acm,dp,woj] 难题,dp好题,几何题 ...

  7. 图解算法——恢复一棵二叉搜索树(BST)

    题目来源 基础:给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换.请在不改变其结构的情况下,恢复这棵树. 进阶:使用 O(n) 空间复杂度的解法很容易实现.你能想出一个只使用常数空间的 ...

  8. codeforces 01B

    B. Spreadsheets time limit per test 10 seconds memory limit per test 64 megabytes input standard inp ...

  9. vagrant + virtualbox安装centos环境+docker安装

    1. 下载vagrant 并安装,安装完成后,输入vagrant回车查看是否安装成功 2. 下载virtualbox.box并安装,安装完成后. 3. 创建虚拟机文件夹,例如.F:/vmimg/fir ...

  10. XCTF攻防世界web进阶练习—mfw

    XCTF攻防世界web进阶练习-mfw题目为mfw,没有任何提示.直接打开题目,是一个网站 大概浏览一下其中的内容,看到其中url变化其实只是get的参数的变化查看它的源码,看到有一个?page=fl ...