后序遍历

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

巧了我就是萌 提交于 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 此题需要求一棵树中最大的路径和,属于求树的路径问题

[学习笔记] Python实现树的遍历 (DFS)

六眼飞鱼酱① 提交于 2020-02-03 18:27:37
学习了通过Python实现树的遍历(DFS) 自己还原了一下代码 #树 DFS class TreeNode(object): def __init__(self,x) : self.val = x self.left = None self.right = None if __name__ == '__main__': #构建树 t1 = TreeNode(1) t2 = TreeNode(2) t3 = TreeNode(3) t4 = TreeNode(4) t5 = TreeNode(5) t6 = TreeNode(6) t7 = TreeNode(7) t8 = TreeNode(8) t1.left = t2 t1.right = t3 t2.left = t4 t2.right = t5 t3.left = t6 t3.right = t7 t6.right = t8 #递归 # 先序 (根 -> 左儿子 -> 右儿子) def preOrderRecusive(root): if root == None: return print(root.val) preOrderRecusive(root.left) preOrderRecusive(root.right) # 中序 (左儿子 -> 根 -> 右儿子) def midOrderRecusive(root):

二叉树遍历的递归与非递归写法_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仍为空,下一次循环直接出栈, //此处巧妙将叶子节点与常规节点的代码统一 } } 后序遍历的非递归写法

数据结构 - 二叉树(删除节点)

点点圈 提交于 2020-02-03 06:53:43
因为二叉树是单向的,所以要判断当前节点的子节点(左或右)是否是被删除的节点 //递归删除节点 //规定:如果是叶子节点就删除节点,如果非叶子节点就删除子树 public void delNode ( int no ) { if ( this . left != null && this . left . no == no ) { this . left = null ; return ; } if ( this . right != null && this . right . no == no ) { this . right = null ; return ; } if ( this . left != null ) { this . left . delNode ( no ) ; } if ( this . right != null ) { this . right . delNode ( no ) ; } } //删除节点 public void delNode ( int no ) { if ( root != null ) { //判断root是不是要删除的节点 if ( root . getNo ( ) == no ) { root = null ; } else { root . delNode ( no ) ; } } } 完整代码 package tree ;

数据结构——树

非 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

树结构之线索化二叉树

馋奶兔 提交于 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

数据结构 递归遍历二叉树 C/C++

断了今生、忘了曾经 提交于 2020-01-31 06:38:47
#include<stdio.h> #include<stdlib.h> typedef struct btnode { char data; struct btnode *lchild,*rchild; }btnode,*bitree; bitree Creatbintree() //前序遍历创建二叉树 { char ch; bitree bt; scanf("%c",&ch); if(ch=='#') bt=NULL; else { bt=(btnode*)malloc(sizeof(btnode)); bt->data=ch; bt->lchild=Creatbintree(); bt->rchild=Creatbintree(); } return bt; } void Preorder(bitree bt) //前序遍历 { if(bt==NULL) return; printf("%c ",bt->data); Preorder(bt->lchild); Preorder(bt->rchild); } void Inorder(bitree bt) //中序遍历 { if(bt==NULL) return; Preorder(bt->lchild); printf("%c ",bt->data); Preorder(bt->rchild); } void

数据结构 非递归遍历二叉树

一世执手 提交于 2020-01-31 04:59:35
#include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struct { bitree ptr; int flag; }stacknode; typedef struct { stacknode elm[MAX]; int top; }sqstack; typedef struct btnode { char data; struct btnode *lchild,*rchild; }btnode,*bitree; bitree Creatbintree() //前序遍历创建二叉树 { char ch; bitree bt; scanf("%c",&ch); if(ch=='#') bt=NULL; else { bt=(btnode*)malloc(sizeof(btnode)); bt->data=ch; bt->lchild=Creatbintree(); bt->rchild=Creatbintree(); } return bt; } typedef struct { bitree data[MAX]; int top; }seqstack; seqstack *Init_seqstack() { seqstack *s; s=malloc(sizeof(seqstack)); if(s) s->top=