二叉树遍历

树的遍历

本秂侑毒 提交于 2020-02-08 01:03:36
//二叉树的创建,递归遍历,非递归遍历,拷贝,深度 #include<iostream> #include<stack> using namespace std ; //二叉树的结构 typedef struct BiTNode { char data ; //数据域 struct BiTNode *lchild = nullptr ; //指针必须初始化,c11标准 struct BiTNode *rchild = nullptr ; //左右孩子 } BiTNode,*BiTree ; //二叉树的结构 //二叉树的创建 void CreateBiTree ( BiTree & T ) //先序输入 { char ch ; cin >> ch ; if ( ch == '#' ) T = NULL ; else { T = new BiTNode ; //分配空间 T- > data = ch ; //根节点赋值 CreateBiTree ( T- > lchild ) ; //建立左子树 CreateBiTree ( T- > rchild ) ; //建立右子树 } } //二叉树的创建 //先序遍历 void PreTraverse ( BiTree T ) { if ( T ) { cout << T- > data ; PreTraverse ( T- >

二叉树遍历算法

泪湿孤枕 提交于 2020-02-07 15:51:20
二叉树 是树(Tree)这一数据结构中非常重要的子类,其中每一个节点最多存在两个子节点,在代码中表示就是,除了本身的 Data 值,还会带有 Left 和 Right 子节点。如下图所示,用形如图中的结构构成了整棵树。 任何一种数据结构,都会存在遍历的顺序问题,比如链表,堆栈等等;二叉树这种数据结构也有遍历的顺序,由于其非线性的结构特征,遍历时的顺序有这三种, 前序(pre-order),中序(in-order),后序(post-order) 。下面依次介绍一下: 1 前序(pre-order)遍历 基本的原则是 “根 -> 左 -> 右” ,重复直到整棵树的节点被浏览一遍。 1.1 Recursive 版本: 1 def preOrder( self, treenode ): 2 # Recursive version 3 if treenode == None: 4 return 5 print treenode.data 6 self.preOrder( treenode.left ) 7 self.preOrder( treenode.right ) 这段代码非常好理解,它就是用“根 -> 左 -> 右”的定义方式来写的,迭代调用,直至没有节点可以访问。 print treenode.data # 打印访问节点(根)的值 self.preOrder( treenode )

数据结构之二叉树遍历

允我心安 提交于 2020-02-07 15:50:32
一、树的遍历操作 树的遍历:从根节点出发,按照某种次序访问树中所有结点,使得每个结点被访问一次且仅被访问一次。 遍历的实质为将树结构(非线性结构)转换为线性结构。 树通常有前序(根)遍历、后序(根)遍历和层序(次)遍历三种方式。 前序遍历: 树的前序遍历操作定义为: 若树为空,则空操作返回; 否则 (1)访问根结点;   (2)按照从左到右的顺序前序遍历根结点的每一棵子树 图中树的前序遍历序列为:A B D E H I F C G 树的后序遍历操作定义为: 若树为空,则空操作返回; 否则 ⑴ 按照从左到右的顺序后序遍历根结点的每一棵子树; ⑵ 访问根结点。 图中树的后序遍历序列: D H I E F B G C A 树的层序遍历操作定义为: 从树的第一层(即根结点)开始,自上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。 图中树的层序遍历序列: A B C D E F G H I 二、二叉树的遍历操作 前序(根)遍历: 若二叉树为空,则空操作返回; 否则: ①访问根结点; ②前序遍历根结点的左子树; ③前序遍历根结点的右子树。 图中二叉树的前序遍历序列:A B D G C E F 中序(根)遍历: 若二叉树为空,则空操作返回; 否则: ①中序遍历根结点的左子树; ②访问根结点; ③中序遍历根结点的右子树。 图中二叉树的中序遍历序列:D G B A E C F 后序(根

【Python数据结构与算法笔记day36】7.2. 二叉树的遍历+深度优先遍历+ 广度优先遍历(层次遍历)

吃可爱长大的小学妹 提交于 2020-02-07 10:36:43
文章目录 7.2. 二叉树的遍历 二叉树的遍历 深度优先遍历 广度优先遍历(层次遍历) 7.2. 二叉树的遍历 二叉树的遍历 树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次,我们把这种对所有节点的访问称为遍历(traversal)。那么树的两种重要的遍历模式是深度优先遍历和广度优先遍历, 深度优先一般用递归,广度优先一般用队列。一般情况下能用递归实现的算法大部分也能用堆栈来实现。 深度优先遍历 对于一颗二叉树,深度优先搜索(Depth First Search)是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。 那么深度遍历有重要的三种方法。这三种方式常被用于访问树的节点,它们之间的不同在于访问每个节点的次序不同。这三种遍历分别叫做先序遍历(preorder),中序遍历(inorder)和后序遍历(postorder)。我们来给出它们的详细定义,然后举例看看它们的应用。 先序遍历 在先序遍历中,我们先访问根节点,然后递归使用先序遍历访问左子树,再递归使用先序遍历访问右子树 根节点->左子树->右子树 def preorder ( self , root ) : """递归实现先序遍历""" if root == None : return print root . elem self . preorder (

二叉树遍历算法的应用

混江龙づ霸主 提交于 2020-02-05 00:18:12
文章目录 先序遍历的顺序建立二叉链表 复制二叉树 计算二叉树的深度 统计二叉树中结点的个数 计算二叉树叶子结点数 先序遍历的顺序建立二叉链表 【算法步骤】 ①扫描字符序列,读入字符ch ②如果ch是一个“#”字符,则表明该二叉树为空树,即 T 为NULL;否则执行以下操作: 申请一个结点空间 T 将 ch 赋给T->data 递归创建T的左子树 递归创建T的右子树 【算法描述】 void CreateBiTree ( BiTree & T ) { cin >> ch ; if ( ch == '#' ) T = NULL ; //递归结束,建空树 else { T = new BiTNode ; //生成根结点 //或T=(BiTNode*)malloc(sizeof(BiTNode)); T - > data = ch ; //根结点数据域置为ch CreateBiTree ( T - > lchild ) ; //递归创建左子树 CreateBiTree ( T - > rchild ) ; //递归创建右子树 } } 复制二叉树 【算法步骤】 如果是空树,递归结束,否则执行以下操作: 申请一个新结点空间,复制根结点 递归复制左子树 递归复制右子树 【算法描述】 void Copy ( BiTree T , BiTree & newT ) { if ( T == NULL )

数据结构——二叉树(基础)

巧了我就是萌 提交于 2020-02-04 05:02:30
1、树存在意义: 1)数组的存储方式的分析 优点:通过下标方式访问元素,速度快,对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率低。 2)链式存储方式的分析 优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,连接到链表即可,删除效率也很好)。 缺点:在进行检索时,效率仍然很低,检索某个值,需要从头节点开始遍历。 3)树的存储方式分析 能提高存储,读取的效率,比如利用二叉排序树(Binary Sort Tree),既可以保证数据的检索速度,同事也可以保证数据的插入,删除,修改的速度 2、树的常用术语: 节点 :如A,B,F分别是树的节点; 根节点 :如A是整棵树的根节点; 父节点 :如B是E的父节点; 子节点 :如E是B的子节点; 叶子节点 :没有子节点的节点,如D.H,F,G都是叶子节点; 权 :若将树中节点赋给一个有着某种含义的数值,则这个数值称为该结点的权; 路径 :从root结点(根节点)找到该节点的路线,如H节点的路径为{A,B,E,H}; 层 :从根开始定义起,根为第一层,根的孩子为第二层。若某节点在第k层,则其子树的就在第k+1 层。如节点E的层数为3; 子树 :如集合{B,D,E,H}为A的一颗子树; 树的高度 :树的最大层数,如示例图树的高度为4; 森林 :是m (m>

Leetcode tree Top Interview Questions 12道题总结

元气小坏坏 提交于 2020-02-04 00:17:53
本篇文章是对leetcode tree和Top Interview Questions标签下12道array类型题目的总结 Leetcode 104. Maximum Depth of Binary Tree 此题需要求一颗二叉树的最大深度,可归结于树的遍历问题 解:使用DFS,添加一个depth参数,每递归一层,depth++,并且每次求最大值 Leetcode 230. Kth Smallest Element in a BST 此题需要求一颗二叉树中第k小的结点,归结于树的遍历问题 解: 根据题目意思,可以从小到大遍历二叉树,那么得到便是一串从小到大的序列,第k个即为所求,所以使用中序,并使用一个数组存储,求第k个即可 如果使用迭代,那么可以不需要遍历整棵树 Leetcode 108. Convert Sorted Array to Binary Search Tree 此题需要将一颗有序数组转换为二叉树,属于树的构建问题 解:使用分治法,取中间的数作为根节点,然后对左右两边采取同样的操作 Leetcode 101. Symmetric Tree 此题需要求一棵树是否为对称树 解:对称问题,可以通过复制本身,然后分别从不同方向遍历来解决! Leetcode 124. Binary Tree Maximum Path Sum 此题需要求一棵树中最大的路径和,属于求树的路径问题

二叉树遍历的递归与非递归写法_C语言

巧了我就是萌 提交于 2020-02-03 12:11:46
前言 中序遍历的非递归写法 后序遍历的非递归写法 完整代码 前言 二叉树的三种遍历的递归写法,只要理解思想,几行代码就可以完成。可是非递归写法却很不容易。这里特地总结下,透彻解析它们的非递归写法。其中,中序遍历的非递归写法最简单,后序遍历最难。 中序遍历的非递归写法 非递归算法,必然要用到栈(可参考完整代码中栈的实现)。这里着重讲下中序遍历的写法。 void InorderTraversal ( BinTree BT ) { BinTree T ; Stack TreeStack ; TreeStack = CreateStack ( ) ; T = BT ; while ( T || ! IsEmpty ( TreeStack ) ) { //注意循环结束的条件 while ( T ) { //将左子树一口气全部入栈 Push ( TreeStack , T ) ; T = T -> Left ; } T = Pop ( TreeStack ) ; // 退出循环时,T为空,即再无左子树 printf ( "%d " , T -> Data ) ; //此时,打印该节点值 T = T -> Right ; //而后,转向右子树,若该节点为叶子节点, //则T仍为空,下一次循环直接出栈, //此处巧妙将叶子节点与常规节点的代码统一 } } 后序遍历的非递归写法

bfs 二叉树 遍历

匆匆过客 提交于 2020-02-03 07:03:48
bfs 遍历二叉树 之前只知道bfs 的思想以及需要使用队列来进行存储 为了更好的理解bfs 手写了bfs 遍历二叉树的两种方式 方法: 一种是采用常用的递归执行 另一种是采用循环执行(使用栈来代替递归) 二叉树定义 class Node { //get set方法省略 private Node leftChild ; private Node rightChild ; private int data ; public Node ( int data ) { this . data = data ; } } 构造二叉树 Node node = new Node ( 1 ) ; node . setLeftChild ( new Node ( 2 ) ) ; node . setRightChild ( new Node ( 3 ) ) ; node . getLeftChild ( ) . setLeftChild ( new Node ( 4 ) ) ; node . getLeftChild ( ) . setRightChild ( new Node ( 5 ) ) ; bfs ( node ) ; 使用bfs 方式一:递归 public static void bfs ( Node node ) { if ( node != null ) { System . out .

数据结构——树

非 Y 不嫁゛ 提交于 2020-02-03 01:25:35
树 二叉树 特殊形态的二叉树:满二叉树、完全二叉树 二叉树的遍历 1):前序遍历 如果当前遍历的节点不为空 输出这个结点 进入它的左孩子 进入它的右孩子 2):中序遍历 如果当前遍历节点不为空 进入它的左孩子 输出这个节点 进入它的右孩子 3):后序遍历 如果当前遍历节点不为空 进入它的左孩子 进入它的右孩子 输出这个的结点 4):层序遍历 相关习题 1) Pre: ABCDEFGHIJ In: CDBEAGHFJI 2)In:DCBEGFAIJHLK Post: DCGFEBJILKHA 3):Pre:ABCDEF In: CBAEFD 此为临时文档,后续会补充完善。 来源: CSDN 作者: mango660 链接: https://blog.csdn.net/mango660/article/details/104147635