先序遍历(递归)

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. Eureka详解系列(四)--Eureka Client部分的源码和配置

    简介 按照原定的计划,我将分三个部分来分析 Eureka 的源码: Eureka 的配置体系(已经写完,见Eureka详解系列(三)--探索Eureka强大的配置体系): Eureka Client ...

  2. HDFS读写流程(转载)

    概述开始之前先看看其基本属性,HDFS(Hadoop Distributed File System)是GFS的开源实现.特点如下:    能够运行在廉价机器上,硬件出错常态,需要具备高容错性    ...

  3. 2019牛客暑期多校训练营(第七场)F-Energy stones(思维+树状数组)

    >传送门< 题意:有n块能量石,每秒钟会增加Li的能量,但是一旦增长到了Ci它就不会增长了,它初始的能量为Ei. 现在有若干个时刻ti,会选择下标在[Si,Ti]的能量石吸取它们的能量,这 ...

  4. Java多线程同步和异步问题

    我们首先来说一下多线程: 多线程很形象的例子就是:在一个时刻下,一个班级的学生有人在拖地,有人在擦窗户,有人在擦桌子 按照单线程程序,肯定是先去拖地,再去擦窗户,再去擦桌子.但是在多线程就好像他们在一 ...

  5. 【noi 2.6_6252】带通配符的字符串匹配(DP)

    题意:给出一个带有通配符("?"可以代替一个字符,"*"可以代替零个或多个字符)的a字符串和一个不带通配符的b字符串,判断他们是否能够匹配. 解法:f[i][j ...

  6. Codeforces #637 div2 B. Nastya and Door

    题意:给你一个数组a,定义:若a[i]>a[i]&&a[i]>a[i-1],则a[i]为峰值,求长度为k的区间内峰值最多能为多少,并输出这个区间的左端点(区间需要将峰的左边 ...

  7. CF1475-C. Ball in Berland

    CF1475-C. Ball in Berland 题意: 一个班级有\(a\)个男生和\(b\)个女生,现在这个班级有\(k\)对男女愿意一起出席毕业典礼,这里注意\(k\)对男女中可能会有某个男生 ...

  8. Leetcode(23)-合并K个排序链表

    合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: 1-&g ...

  9. php性能分析利器:xhprof

    xhprof是facebook团队开发的用于研究php性能的扩展,并且提供了图形化的界面展示性能参数和过程.对于各种php的项目的性能瓶颈研究有一定帮助,值得一用. 我在上一篇<Dockerfi ...

  10. git hooks All In One

    git hooks All In One $ xgqfrms git:(main) cd .git/ $ .git git:(main) ls COMMIT_EDITMSG HEAD branches ...