二叉树遍历

二叉树的建立和遍历

拜拜、爱过 提交于 2019-12-02 18:46:59
二叉树(Binary Tree)是n(n >= 0)个节点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根节点和两颗互不相交的,分别称为根节点的左子树和右子树的二叉树组成。 二叉嘛,也就是每个节点最多有两个分支。 图示: 二叉树具有五种基本形态: 1.空二叉树 2.只有一个根节点 3.根节点只有左子树 4.根节点只有右子树 5.根节点既有左子树又有右子树 特殊的二叉树: 1.斜树(只有左子树的称为左斜树,只有右子树的称为右斜树,两者统称为斜树) 2.满二叉树(所有的分支节点都存在左子树和右子树,并且所得树叶都在同一层上) 3.完全二叉树的特征: 1.叶子结点只能出现在最下两层 2.最下层的叶子一定集中在左部连续位置 3.倒数二层,若有叶子结点,一定都在右部连续位置 4.如果节点度为1(这里的度与离散数学中的度不一样,这里的度是指节点所拥有的子树数),则该节点只有左孩子,即不存在只有右子树的情况 5.同样节点数的二叉树,完全二叉树的深度最小 二叉树的性质: 性质1:在二叉树的第i层上至多有2^(i - 1)个节点(i >= 1) 性质2:深度为k的二叉树至多有2^k - 1个节点(k >= 1) 性质3:对任何一颗二叉树T,如果其终端节点数为n0,度为2的节点数为n2,则n0 = n2 + 1 性质4:具有n个节点的完全二叉树的深度为[log2n] + 1([

数据结构实验之二叉树三:统计叶子数

血红的双手。 提交于 2019-12-02 14:27:08
数据结构实验之二叉树三:统计叶子数 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点)。请建立二叉树并求二叉树的叶子结点个数。 Input 连续输入多组数据,每组数据 输入一个长度小于50个字符的字符串。 Output 输出二叉树的叶子结点个数。 Sample Input abc,,de,g,,f,,, Sample Output 3 Hint Source xam 这个题跟上一个树的遍历相差不大,就是在遍历的时候记录一下叶子结点的个数即可,如果树的建立和遍历不熟练的同学可以参考我的上一篇博客,写的比较详细希望能帮到。 链接: 二叉树的建立与遍历 具体见代码注释。 AC代码: #include<bits/stdc++.h> using namespace std; char a[100]; int x,y;//这个y是用来记录最后输出的结果的,因为定义了遍历函数,所以要在宏观上进行定义 //但是y在while循环中要记得定义上y=0,以防多次输入数据的累加而造成输出错误 typedef struct node { int data; struct node*lchild,

Python数据结构和算法(五)------树与树算法

岁酱吖の 提交于 2019-12-02 12:44:33
树与树算法 目录 树与树算法 一、关于树的一些概念 1.树的定义 2.树的术语 3.树的分类 4.树的存储与表示 二、二叉树 1.基本概念 2.基本性质 3.二叉树的存储 4.二叉树的节点创建和广度遍历 5.二叉树的深度遍历 6.由遍历结果确定一棵二叉树 一、关于树的一些概念 1.树的定义 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 每个节点有零个或多个子节点; 没有父节点的节点称为根节点; 每一个非根节点有且只有一个父节点; 除了根节点外,每个子节点可以分为多个不相交的子树; 2.树的术语 节点的度 :一个节点含有的子树的个数称为该节点的度; 树的度 :一棵树中,最大的节点的度称为树的度; 叶节点或终端节点 :度为零的节点; 父亲节点或父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点; 孩子节点或子节点 :一个节点含有的子树的根节点称为该节点的子节点; 兄弟节点 :具有相同父节点的节点互称为兄弟节点; 节点的层次 :从根开始定义起,根为第1层,根的子节点为第2层,以此类推; 树的高度或深度 :树中节点的最大层次; 堂兄弟节点

二叉树的遍历

烈酒焚心 提交于 2019-12-02 12:25:28
递归遍历 前序 //前序遍历 void PreOrder(BTnode *pnode) { if (pnode) { visit(pnode); PreOrder(bnode->left); PreOrder(bnode->right); } } 中序 //中序遍历 void InOrder(BTnode *pnode) { if (pnode) { InOrder(pnode->left); 递归遍历 visit(pnode); InOrder(pnode->right); } } 后序 //后序遍历 void PostOrder(BTnode *pnode) { if (pnode) { PostOrder(pnode->left); PostOrder(pnode->right); visit(pnode); } } 非递归遍历 前序 ​ 先访问根节点,再将其入栈,以便之后返回,就这样一直遍历到左子树最下面,然后出栈,进入右子树,继续开始遍历。 //前序遍历 void PreOrder1(BTnode *pnode) { stack<*BTnode> s; BTnode *p = pnode; while (p || !s.empty()) { while (p) { visit(p); //先访问根节点,再入栈 s.push(p); p = p->left; /

与世无争的帅哥 提交于 2019-12-02 11:42:39
树的介绍 1. 树的定义 树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。 把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: (01) 每个节点有零个或多个子节点; (02) 没有父节点的节点称为根节点; (03) 每一个非根节点有且只有一个父节点; (04) 除了根节点外,每个子节点可以分为多个不相交的子树。 2. 树的基本术语 若一个结点有子树,那么该结点称为子树根的"双亲",子树的根是该结点的"孩子"。有相同双亲的结点互为"兄弟"。一个结点的所有子树上的任何结点都是该结点的后裔。从根结点到某个结点的路径上的所有结点都是该结点的祖先。 结点的度 :结点拥有的子树的数目。 叶子 :度为零的结点。 分支结点 :度不为零的结点。 树的度 :树中结点的最大的度。 层次 :根结点的层次为1,其余结点的层次等于该结点的双亲结点的层次加1。 树的高度 :树中结点的最大层次。 无序树 :如果树中结点的各子树之间的次序是不重要的,可以交换位置。 有序树 :如果树中结点的各子树之间的次序是重要的, 不可以交换位置。 森林 :0个或多个不相交的树组成。对森林加上一个根,森林即成为树;删去根,树即成为森林。 二叉树的介绍 1. 二叉树的定义 二叉树是每个节点最多有两个子树的树结构。它有五种基本形态:二叉树可以是空集

《剑指offer》树专题 (牛客10.25)

╄→尐↘猪︶ㄣ 提交于 2019-12-02 11:40:54
考察的知识点主要在于树的数据结构(BST,AVL)、遍历方式(前序,中序,后序,层次)、遍历算法(DFS,BFS,回溯)以及遍历时借助的数据结构如队列和栈。由于树本身就是一个递归定义的结构,所以在递归求解问题时,要善于将问题转化成合适的子问题,思考清楚子问题的形式、递归的出口、父问题与子问题的联系。 以下这些问题难度都不太大,很多都是一次过,比上次链表专题的思维难度小多了。 难度 题目 知识点 04. 重建二叉树 依据前序和中序遍历重建 , 递归 ★★ 17. 树的子结构 递归 18. 二叉树的镜像 简单递归 22. 从上往下打印二叉树 bfs , Queue的使用 23. 判断是否为二叉搜索树的后序遍历序列 BST , 递归 ★ 24. 二叉树中和为某一值的路径 dfs , 回溯 , Collections.sort() ★★ 26. 二叉搜索树与双向链表 递归 中序遍历 ★ 38. 二叉树的深度 递归 39. 平衡二叉树 平衡二叉树 递归 57. 二叉树的下一个结点 中序遍历 循环 回溯后的情况 58. 对称的二叉树 递归 可转化为非递归 59. 按之字形顺序打印二叉树 Stack 层次遍历变形 60. 把二叉树打印成多行 Queue LinkedList 层次遍历 ★★ 61. 序列化二叉树 递归 string.split() string.equals 62.

二叉树的前中后序遍历

ⅰ亾dé卋堺 提交于 2019-12-02 11:16:47
二叉树的前中后遍历,其前中后,您可理解为指的是根结点所在的序。 前序遍历:前序遍历的顺序为根-左-右 中序遍历:中序遍历的顺序为左-根-右 后序遍历:后序遍历的顺序为左-右-根 1.前序遍历 思路:利用栈后进先出的特性。 1.根结点入栈; 2.循环取栈顶元素、右子结点入栈、左子结点入栈。 JAVA参考代码 public class TreeNode { int val ; TreeNode left ; TreeNode right ; ​ TreeNode ( int val ) { this . val = val ; } } public List < Integer > preorderTree ( TreeNode root ) { Stack < TreeNode > stack = new Stack < > ( ) ; List < Integer > preorder = new ArrayList < > ( ) ; ​ if ( root == null ) { return preorder ; } ​ stack . push ( root ) ; while ( ! stack . empty ( ) ) { TreeNode node = stack . pop ( ) ; preorder . add ( node . val ) ; if (

二叉树的递归遍历(java实现)

跟風遠走 提交于 2019-12-02 11:04:30
二叉树的递归遍历(java实现) 二叉树是数据结构中非常重要的一章,而二叉树的遍历是重中之重。本文记载了我构造二叉树并对一棵简单的二叉树进行前、中、后序遍历的经验,因为本人是新手,不足之处还请谅解,欢迎指正。 创建树类 package tree ; public class BinaryTree { TreeNode root ; public BinaryTree ( ) { System . out . println ( "创建一棵树完成" ) ; } //设置根节点 public void setRoot ( TreeNode root ) { this . root = root ; System . out . println ( "在树中成功创建了一个根节点" ) ; } } 创建节点类 package tree ; public class TreeNode { //节点中具有value值,此处声明 int value ; //值的两端是左右节点的引用 TreeNode leftNode ; TreeNode rightNode ; //构造器,在声明一个节点时传值。 public TreeNode ( int value ) { this . value = value ; } //创建一个节点的左节点 public void setLeftNode (

二叉树建立与遍历

北慕城南 提交于 2019-12-02 11:04:19
1.以二叉链表表示二叉树,建立一棵二叉树; 2.输出二叉树的中序遍历结果; 3.输出二叉树的前序遍历结果; 4.输出二叉树的后序遍历结果; 5.输出二叉树的层序遍历结果。 # include <iostream> using namespace std ; typedef struct BiTNode { char data ; struct BiTNode * lchild , * rchild ; } BiTNode , * BiTree ; void CreateBiTree ( BiTree & T ) { char x ; cin >> x ; if ( '#' == x ) T = NULL ; else { T = new BiTNode ; T - > data = x ; CreateBiTree ( T - > lchild ) ; CreateBiTree ( T - > rchild ) ; } } void PreOrderTraverse ( BiTree T ) { if ( ! T ) return ; else { cout << T - > data << " " ; PreOrderTraverse ( T - > lchild ) ; PreOrderTraverse ( T - > rchild ) ; } } void

二叉树的线索化思想解析与代码实现

雨燕双飞 提交于 2019-12-02 06:47:01
二叉树线索化 思想重于代码:写程序是为了验证思想,这里讲解部分比较多,还望耐心哈!! 二叉树线索化目的是想将二叉树的中序遍历不用递归方式实现,同时也充分的利用叶子结点的左右孩子空间,但是需额外引入一个标志,该标志用于判断该结点的左右孩子是线索连接的前驱后继还是直接连接左右孩子。并通过该链表将中序遍历的结点连成一条链,即遍历链表相当于二叉树的中序遍历。 问题:为什么要引入线索化这个概念? 1.对叶子的左右孩子的充分利用 2.当二叉树有大量结点时,需要进行很多次递归调用,需要消耗很大的栈空间。 3.可以直接访问当前结点的前驱后继,不需要重新从根节点往下再次遍历,效率高。 那么如何实现呢? 引入标志位 tag,一般使用枚举类型 enum{ Link,Thread }; Link表示孩子,Thread表示线索指向前驱后继 创建一个普通二叉树(即无线索化) 中序遍历二叉树进行线索化,线索化时需要引入一个辅助结点”pre”,这个结点左孩子一开始指向二叉树的根节点,右孩子指向空,我们知道在线索化时二叉树每个叶子都将被标志位Thread,指向他们的前驱后继,这时候考虑一个问题,在中序遍历时我们是无法知道当前结点的前驱或后继对应的是哪个结点,所以pre变量可以作为上一个结点的缓存。可以发现每一个叶子的前驱需要由pre指定,而后继需要在下一次(中序遍历的下一个结点)进行确定