二叉树遍历

树结构之线索化二叉树

馋奶兔 提交于 2020-02-02 08:11:55
数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树 当对上面的二叉树进行中序遍历时,顺序为: 8, 3, 10, 1, 6, 14 ,但是 6, 8, 10, 14 这几个节点的 左右指针,并没有完全的利用上 . 如 果希望充分的利用 各 个节点的左右指针, 让各个节点可以指向自己的前后节点,该怎么办? 解决方案: 线索二叉树 中序线索化后: 1、 n 个结点的二叉链表中含有 n+1 【 公式 2n- (n-1)= n+1】 个 空指针域。利用二叉链表中的空指针域,存放指 向 该 结点 在 某种遍历次序 下的前驱和后继结 点的指针( 这种附加的指针称为 " 线索 " ) 2、这种加上了线索的二叉链表称为 线索链表 ,相应的二叉树称为 线索二叉树 (Threaded BinaryTree ) 。根据线索性质的不同,线索二叉树可分为 前序线索二叉树、中序线索二叉树 和 后序线索二叉树 三 种 3、一个结点的前一个结点 ,称为 前驱 结点 4、一个结点的后一 个结点 ,称为 后继 结点 注意: 1、left 指向的是左子树,也可能是指向的前驱节点 . 比如节点1的 left 指向的左子树 , 而节点10的 left 指向的就是前驱节点 . 2、right指向的是右子树,也可能是指向后继节点,比如 节 点1的 right 指向的是右子树,而节点10的 right

树(一)树的遍历

大兔子大兔子 提交于 2020-01-31 17:45:35
树的遍历 近期参加复旦互联网协会的刷题营,所以我勉勉强强又开始做题啦。现在变得更务实啦,要想提升能力,超过别人就是要依靠一项项的指标的胜利,这样的评价是更加客观的。想要提升能力,一方面要靠平时的积累,另外一方面也要依靠瓶颈期的奋力一搏。当然,我的意思是更加侧重前者的。话不多说啦,开始今天的话题——树的遍历。如果用递归的方法是非常简单,也是非常推荐的。但是,用迭代的方法也不难!!!所以我决定在这里探讨一下。 LeetCode题目 中序遍历 , 前序遍历 和 后序遍历 。当然,我知道有的朋友,就是喜欢野蛮自己的体魄,那你可以试一试, 从中序与后序遍历序列构造二叉树 , 从前序与中序遍历序列构造二叉树 以及 根据前序和后序遍历构造二叉树 。 保证你可以受到全身心的虐待。 各种遍历——递归实现 首先是TreeNode结构。 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 三种遍历的区别在于,什么时候访问root的值。下面是中序遍历,返回按序排序的值。 class Solution { List<Integer> list = new LinkedList<>(); public List<Integer> inorderTraversal

NowCoder 二叉搜索树的后序遍历序列 递归

拈花ヽ惹草 提交于 2020-01-31 03:03:42
题意:给一串序列,判断该序列是否某二叉树的后序遍历序列 思路:后序遍历最后一个节点为根节点,前面的都可以分成连续的两部分,一部分比根节点小,另一部分比根节点大,依次分块递归判断两部分是否连续即可 public class Solution { public boolean VerifySquenceOfBST ( int [ ] sequence ) { if ( sequence == null || sequence . length == 0 ) return false ; return solve ( sequence , 0 , sequence . length - 1 ) ; } public boolean solve ( int [ ] a , int l , int r ) { if ( l >= r ) return true ; int i = l , root = a [ r ] , mid ; for ( ; i < r ; i ++ ) { if ( a [ i ] > root ) break ; } mid = i ; for ( ; i < r ; i ++ ) { if ( a [ i ] < root ) return false ; } return solve ( a , l , mid - 1 ) && solve ( a , mid

二叉树的遍历

僤鯓⒐⒋嵵緔 提交于 2020-01-30 12:34:34
一、实验目的 1、掌握二叉树的特点及其存储方式; 2、掌握二叉树的创建; 3、掌握二叉树先序、中序、后序遍历的基本方法及应用; 二、实验内容 1、用先序方法建立一棵二叉树; 2、实现先序、中序和后序遍历二叉树的操作; 3、实现统计二叉树叶子结点个数和计算二叉树深度的操作; 三、实验环境 Eclipse环境或C++编程环境 四、实验步骤 1、二叉链表节点类的定义; 2、二叉树类的定义; 3、建立下图所示的二叉树 在以字符串的形式“根左右”定义一棵二叉树时,写出创建二叉树的操作: 4、编程实现以上二叉树的先序、中序和后序遍历操作,输出遍历序列; 5、完成统计以上二叉树中叶子结点的个数或计算以上二叉树的深度; 节点类: package shiyan2 ; public class BiTreeNode { public Object data ; public BiTreeNode lchild , rchild ; public BiTreeNode ( ) { this . data = null ; this . lchild = null ; this . rchild = null ; } public BiTreeNode ( Object data ) { this . data = data ; this . lchild = null ; this . rchild =

树与二叉树

戏子无情 提交于 2020-01-30 11:11:20
树 有许多逻辑关系并不是简单的线性关系,在实际场景中,常常存在着一对多,甚至是多对多的情况。其中树和图就是典型的非线性数据结构,我们首先讲一讲树的知识。 什么是树呢?在现实生活中有很多体现树的逻辑的例子。例如你家的“家谱”,就是一个“树”。再如企业里的职级关系,也是一个“树”。 除人与人之间的关系之外,许多抽象的东西也可以成为一个“树”,如一本书的目录。 以上这些例子有什么共同点呢?为什么可以称它们为“树”呢?因为它们都像自然界中的树一样,从同一个“根”衍生出许多“枝干”,再从每一个“枝干”衍生出许多更小的“枝干”,最后衍生出更多的“叶子”。 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 每个节点有零个或多个子节点; 没有父节点的节点称为根节点; 每一个非根节点有且只有一个父节点; 除了根节点外,每个子节点可以分为多个不相交的子树; 下面这张图,就是一个标准的树结构。 在上图中,节点1是根节点(root);节点5、6、7、8是树的末端,没有“孩子”,被称为叶子节点(leaf)。图中的虚线部分,是根节点1的其中一个子树。 同时,树的结构从根节点到叶子节点

二叉树的创建与递归和非递归遍历

瘦欲@ 提交于 2020-01-29 23:53:28
二叉树的常规操作就是遍历,这也是二叉树的基本功之一 class TreeNode(): def __init__(self, x): self.val = x self.left = None self.right = None class BinaryTree(object): def __init__(self, pre, tin): self.pre = pre self.tin = tin self.levelTrave = [] # 层次遍历结果 self.preTraveRecur = [] # 前序递归遍历结果 self.preTraveNoRecur = [] # 前序非递归遍历结果 self.inTraveRecur = [] # 中序递归遍历结果 self.inTraveNoRecur = [] # 中序非递归遍历结果 self.postTraveRecur = [] # 后序递归遍历结果 self.postTraveNoRecur = [] # 后序非递归遍历结果 # 利用前序遍历和中序遍历结果重建二叉树 def reConstructBinaryTree(self, pre, tin): # pre为前序遍历结果,tin为中序遍历结果 if len(pre) == 0: return None if len(pre) == 1: return

二叉树的遍历

醉酒当歌 提交于 2020-01-29 20:47:50
1、二叉树的广度遍历 2、二叉树的深度遍历 二叉树的深度遍历,包括了前序遍历、中序遍历、后续遍历。其命名方式是根节点的遍历顺序, 即:先序遍历:先遍历根节点(根节点->左子树->右子树),即先访问根节点再递归的访问左子树,然后递归的访问右子树。 中序遍历:访问的中间位置为根位置,其主要顺序为(左子树->根节点->右子树),即我们先递归的使用中序遍历访问左子树,让后根节点,然后递归的使用中序遍历访问右子树。 后序遍历:最后访问根节点(左子树->右子树->根节点),即我们先递归的使用后续遍历访问左子树,然后递归的使用后续遍历右子树,最后访问根节点 来源: CSDN 作者: lianchaozhao 链接: https://blog.csdn.net/weixin_40809627/article/details/104105319

二叉树的遍历.队列与栈实现

天大地大妈咪最大 提交于 2020-01-29 20:45:32
树的遍历方法有广度优先(层序遍历),以及深度优先两种方法,分成先序遍历,中序遍历,后序遍历三种。 一.深度优先: 1.递归实现: 先序遍历 输出顺序:根节点,左子树,右子树。 void PreOrderTraversal ( BinTree BT ) { if ( BT ) { //如果树非空 printf ( "%d" , BT - > Data ) ; //输出根节点 PreOrderTraversal ( BT - > Left ) ; //继续递归执行其左子树 PreOrderTraversal ( BT - > Right ) ; //继续递归其右子树 } } 中序输出:左子树,根节点,右子树。 只需要将输出语句放到两个递归语句之间即可。 void PreOrderTraversal ( BinTree BT ) { if ( BT ) { PreOrderTraversal ( BT - > Left ) ; printf ( "%d" , BT - > Data ) ; PreOrderTraversal ( BT - > Right ) ; } } 后序输出:左子树,右子树,根节点。 void PreOrderTraversal ( BinTree BT ) { if ( BT ) { PreOrderTraversal ( BT - > Left ) ;

二叉树的非递归遍历

牧云@^-^@ 提交于 2020-01-29 04:41:47
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 1.递归实现 void preOrder1(BinTree *root) //递归前序遍历 { if(root!=NULL) { cout<<root->data<<" "; preOrder1(root->lchild); preOrder1(root->rchild); }} 2.非递归实现 根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下: 对于任一结点P: 1)访问结点P,并将结点P入栈; 2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,则将P的左孩子置为当前的结点P; 3

遍历线索化二叉树

爷,独闯天下 提交于 2020-01-28 18:30:08
遍历线索化二叉树 常规的线索化方式 采用递归地调用的方式,判定条件是当前指针的左子树是否为空 代码实现: public void midOrder ( ) { if ( this . left != null ) { this . left . midOrder ( ) ; } System . out . println ( this ) ; if ( this . right != null ) { this . right . midOrder ( ) ; } } 对比: 但是对二叉树进行线索化之后,不存在空的左右指针,但是单独设置每一个指针的类型,故而条件修改为指针的类型。 代码实现 我的代码 public void midLIst ( ) { if ( this . getLeftType ( ) != 1 ) { this . getLeft ( ) . midLIst ( ) ; } System . out . print ( this + " " ) ; if ( this . getRightType ( ) != 1 ) { this . getRight ( ) . midLIst ( ) ; } } 问题分析与总结: 出现空指针异常,因为到最后一个节点时,其右指针是没有改变,仍旧为null,并且没有对其值进行修改,故而会出现空指针。 代码修改 public