中序遍历

二叉树遍历

不羁岁月 提交于 2020-02-07 07:06:55
前序遍历:根->左->右 中序遍历:左->根->右 后序遍历:左->右->根 假设树节点的定义如下: struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; 递归版 //前序遍历 void preorderTraversalRecursion(TreeNode *node) { if(!node) return; cout << node->val << " ";//操作当前节点 preorderTraversalRecursion(node->left); preorderTraversalRecursion(node->right); } //中序遍历 void inorderTraversalRecursion(TreeNode *node) { if(!node) return; inorderTraversalRecursion(node->left); cout << node->val << " ";//操作当前节点 inorderTraversalRecursion(node->right); } //后序遍历 void postorderTraversalRecursion(TreeNode

二叉树的遍历方式(内附视频讲解,各种语言的中序遍历代码实现)

点点圈 提交于 2020-02-06 03:54:34
二叉树之遍历方式 视频讲解 : 这是博主自己的视频,谢谢大家。 二叉树的遍历方式 b站链接: https://www.bilibili.com/video/av86745570 二叉树的性质 ,允许我们通过一个简单的递归算法来, 按序输出二叉搜索树中的所有关键字 ,这种算法叫做 遍历算法 。 为了讲解方便,先用伪代码顶着先,然后在用具体遍历代码, 具体的遍历代码是用中序遍历算法 >,因为中序遍历应用最广,面试最容易碰到。 那么按照顺序的不同,我们可以将遍历分为: 先序、中序、后序遍历算法 。 先序遍历 ( 根的关键字在其左右子树的关键字之前 ) : 1.对于单个节点而言,先父节点,自己的数据,然后左节点,然后右子节点 2.对于单个子树或者是树而言,先根,然后左子树,右子树。 (视频里面,比较清楚一点) 其实中序、先序、后序在递归的伪代码上, 唯一区别就在于输出语句的位置。 中序遍历 (根的关键字在其左子树的关键字和右子树的关键字之间) : 1.对于单个节点而言,先左子节点,自己,然后右子节点,最后父节点。 2.对于单个子树或者是树而言,先左子树,根节点,然后右子树。 后序遍历 (根关键字在其左右子树的关键字之后) : c语言的中序遍历代码实现,转载至csdn博主weixin_34302561的《二叉树中序遍历 (C语言实现)》博文,侵删: 相关链接:https://blog

树据结构与算法——二分搜索树 动画演示

…衆ロ難τιáo~ 提交于 2020-02-05 19:05:18
文章目录 一、二分查找法 二分查找法变变种:floor和ceil 二、二分搜索树 实现查找表的比较: 二分搜索树定义 插入元素 查找元素 三、二分搜索树的遍历 二分搜索树的遍历(深度优先遍历) 二分搜索树的层序遍历(广度优先遍历) 四、二分搜索树删除节点 删除最大值,最小值 删除任意节点 附录   二叉搜索树是用来解决查找问题的,在介绍二叉搜索树之前,先学习二分查找法。 一、二分查找法   二分查找法只能对于 有序数列 使用(排序后的数组),在中间找一个元素v如果不是v,这在<v和>v两部分查找,时间复杂度为O(logn),如下图所示: 二分查找代码: // 二分查找法,在有序数组arr中,查找target // 如果找到target,返回相应的索引index // 如果没有找到target,返回-1 template < typename T > int binarySearch ( T arr [ ] , int n , T target ) { // 在arr[l...r]之中查找target int l = 0 , r = n - 1 ; while ( r > l ) { //int mid = (l + r)/2; // 防止极端情况下的整形溢出,使用下面的逻辑求出mid int mid = l + ( r - l ) / 2 ; //如果刚好找到 if ( arr [

lintcode73. 前序遍历和中序遍历树构造二叉树

吃可爱长大的小学妹 提交于 2020-02-04 07:08:17
根据前序遍历和中序遍历树构造二叉树. 样例 样例 1 : 输入: [ ] , [ ] 输出: { } 解释: 二叉树为空 样例 2 : 输入: [ 2 , 1 , 3 ] , [ 1 , 2 , 3 ] 输出: { 2 , 1 , 3 } 解释: 二叉树如下 2 / \ 1 3 注意事项 你可以假设树中不存在相同数值的节点 /** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */ class Solution { public : /** *@param preorder : A list of integers that preorder traversal of a tree *@param inorder : A list of integers that inorder traversal of a tree *@return : Root of a tree */ TreeNode * buildTree ( vector < int > & preorder ,

前序遍历、中序遍历和后序遍历

半腔热情 提交于 2020-02-04 06:52:19
前序遍历: 前序遍历就像是从根节点出发的一个小人围着树跑了一圈 中序遍历 中序遍历就像是树画好之后在底下的投影 比如这个图,中序遍历的结果就是HDIBEJAFKCG 后序遍历: 后续遍历就像剪葡萄,将葡萄一颗颗的剪下来 比如这个图:HIDJEBKFGCA 来源: CSDN 作者: minastinis of king 链接: https://blog.csdn.net/qq_40971025/article/details/104152382

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

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

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

点点圈 提交于 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