树的先序、中序、后序和层次遍历的C++递归实现
树的遍历及遍历规则:
先序遍历:根左右
(即先访问根节点,在访问左儿子,最后访问右儿子)
中序遍历:左根右
后序遍历:左右根
层次遍历:按树的深度从小到大一层一层遍历
C++实现(递归):
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int dep[N];
int treedep=0;
vector<int> v[30];
struct node{int v,Next;
}e[N*2];
int first[N];
int n,u1,v1,k=0;
void add(int ui,int vi){++k; e[k].v=vi; e[k].Next=first[ui]; first[ui]=k;
}
void xianxu(int ui,int father){printf("%d ",ui);for(int i=first[ui];i;i=e[i].Next){int vi=e[i].v; if(vi==father) continue;xianxu(vi,ui);}
}
void zhongxu(int ui,int father){int root=ui,lchild=0,rchild=0;for(int i=first[ui];i;i=e[i].Next){int vi=e[i].v; if(vi==father) continue;if(lchild) rchild=vi; else lchild=vi; }if(lchild) zhongxu(lchild,root);printf("%d ",root);if(rchild) zhongxu(rchild,root);
}
void houxu(int ui,int father){int root=ui,lchild=0,rchild=0;for(int i=first[ui];i;i=e[i].Next){int vi=e[i].v; if(vi==father) continue;if(lchild) rchild=vi;else lchild=vi;}if(lchild) houxu(lchild,root);if(rchild) houxu(rchild,root);printf("%d ",root);
}
void cengci(int ui,int father){dep[ui]=dep[father]+1;treedep=max(treedep,dep[ui]);v[dep[ui]].push_back(ui);int lchild=0,rchild=0;for(int i=first[ui];i;i=e[i].Next){int vi=e[i].v; if(vi==father) continue;cengci(vi,ui);}
}
int main(){//freopen("tree.in","r",stdin);//freopen("tree.out","w",stdout);memset(first,0,sizeof(first));memset(dep,0,sizeof(dep));scanf("%d",&n);for(int i=1;i<n;++i){scanf("%d %d",&u1,&v1); add(u1,v1); add(v1,u1);}printf("pretravel:\n");xianxu(1,0);printf("\nmidtravel:\n");zhongxu(1,0);printf("\nsufftravel:\n");houxu(1,0);printf("\ndeptravel:\n");cengci(1,0);for(int i=1;i<=treedep;++i)for(int j=0;j<v[i].size();++j) printf("%d ",v[i][j]);//fclose(stdin); fclose(stdout);return 0;
}
树的先序、中序、后序和层次遍历的C++递归实现相关推荐
- PAT甲级1020 Tree Traversals:[C++题解]树的遍历、由中序序列和后序序列递归建树
文章目录 题目分析 题目链接 题目分析 题意重述:给定一棵二叉树的后序遍历序列和中序遍历序列,让求层次遍历的序列. 分析: 后序遍历:先 左子树.右子树 ,最后再遍历根结点. 中序遍历:先左子树,再根 ...
- 7-10 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数 (10 分)
7-10 先序序列创建二叉树,输出先序序列.中序序列.后序序列并输出叶子结点数 (10 分) 对于给定的二叉树,输出其先序序列.中序序列.后序序列并输出叶子结点数. 输入格式: 二叉树的先序遍历序列. ...
- 二叉树的构造(前序+中序)---(后序 + 中序)
二叉树的构造(前序+中序)-(后序 + 中序) 思路:要对前序+中序(后序+中序)的构建树的动态过程要了解,思路比较简单,在了解了这个过程之后,理解下面代码就容易了. 过程 参考图: 前序 + 中序: ...
- 由前序序列与中序序列实现后序遍历
二叉树是一种特殊的树,二叉树只有两个分支,分别是该节点的左儿子和右儿子. 前序遍历:就是先遍历根节点,然后再访问左子树与右子树.遍历子树的时候同样也是先遍历根节点然后在遍历他的左子树与右子树. 中序遍 ...
- 非递归先、中、后序遍历二叉树(C语言)
文章目录 前言 一.二叉树非递归遍历算法 1.先序遍历 2.中序遍历 3.后序遍历 二.完整程序 三.运行结果实例 前言 本程序采用C语言编写,栈和二叉树的基本操作函数基于严蔚敏老师的<数据结构 ...
- 二叉树遍历方法——前、中、后序遍历(图解)
目录 一.前序遍历 (1)递归版本 (2)非递归版本 二.中序遍历 (1)递归版本 (2)非递归版本 三.后序遍历 (1)递归版本 (2)非递归版本 四.总结 五.测试程序 六.程序输出 二叉树的遍历 ...
- pandas使用fillna函数并设置bfill参数使用列中的后序值填充缺失值
pandas使用fillna函数并设置bfill参数使用列中的后序值填充缺失值(replace missing values with following values in column in da ...
- 已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法...
已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法 #define N 10 //二叉树节点的个数 char postorderstr[]={};//后序序列 char i ...
- Algorithm Gossip (22) 中序式转后序式(前序式)
前言 This Series aritcles are all based on the book <经典算法大全>; 对于该书的所有案例进行一个探究和拓展,并且用python和C++进行 ...
- 栈的应用--中序表达式转后序表达式
栈的应用--中序表达式转后序表达式 infix : a+b*c+(d*e+f)*g postfix : abc*+de*f+g*+ 有以下四种情况: 操作数->直接输出 操作符->将栈顶输 ...
最新文章
- 【转】web 前端研发工程师编程能力飞升之路
- 希捷硬盘固件修复工具_电脑升级高速硬盘后的差异竟如此大!酷鱼510性能实测...
- Python+selenium 自动化-调用dom节点的click()监听事件,强力操作节点,穿透元素进行点击,节点被遮挡不可点击解决方法
- [C++STL]仿函数用法介绍
- LeetCode 1007. 行相等的最少多米诺旋转
- 游戏筑基开发之环形链表及其基本功能(C语言)
- 如何使用wnr计时来管理你的时间计划
- unicode字符和多字节字符的相互转换接口
- linux-系统资源查看-动态
- 整理的敏感词解决思路
- Python和Raspberry Pi物联网系统
- 酷狗歌曲缓存kgtemp转mp3工具
- 打开CMD的方式及常用的DOS命令
- 苹果logo_“林芝苹果”LOGO图形标识公开评选
- html5页面设计技术,H5页面设计技巧有哪些?-鱼爪网
- 如何在手机上拍摄专业证件照片
- 计算机英语词汇音频,[听单词] 计算机专业英语词汇音频84,计算机英语单词MP3
- 客似云来——习题精解
- iPad革命:开发者的机遇和挑战
- 桂隆控制阀水力控制阀的维修和维护