二叉树遍历

Leetcode:99.恢复二叉搜索树

做~自己de王妃 提交于 2019-12-04 02:29:21
二叉搜索树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。 示例 1: 输入: [1,3,null,null,2] 1 / 3 \ 2 输出: [3,1,null,null,2] 3 / 1 \ 2 示例 2: 输入: [3,1,4,null,null,2] 3 / \ 1 4 / 2 输出: [2,1,4,null,null,3] 2 / \ 1 4 / 3 解题思路: 二叉搜索树:中序遍历中没有逆序对。如果知道什么是中序遍历,还有二叉搜索树,本题只能算是easy。 按照题意只交换了二叉树的两个结点,这也就意味着是排序数组中交换了两个元素的位置,这么一想就会变得容易很多。 1. 交换的两个元素中序遍历相邻。这时只会出现一个逆序对,交换两个逆序对结点的的val即可。 2. 两个元素在中序遍历数组中不相邻。会出现两个逆序对,我们只需记录第一个逆序对的第一个结点,以及第二个逆序对的第二个结点即可,最后交换两个结点的val即可。 只需要记录逆序对的位置即可,因此仅用了常数个空间。 C++代码 #define hasLChild(x) (!(x->left==NULL)) #define hasRChild(x) (!(x->right==NULL)) class Solution { public: void recoverTree(TreeNode* root) { /

不一样的二叉树遍历(小学生都会)

百般思念 提交于 2019-12-04 01:46:46
二叉树遍历 二叉树的遍历分为三种,分别是前序遍历,中序遍历和后序遍历。(在这里,我会介绍两种方法) 前序遍历:先根后左子树最后右子树。 中序遍历:先左子树后根最后右子树。 后序遍历:先左子树后右子树最后根。 举个中序遍历例子 原图网址: https://img2018.cnblogs.com/blog/1706194/201910/1706194-20191006152149771-1726377171.png 其它的遍历可以以此类推。这是标准的二叉树遍历方法。 高端方法 刚才的做法很标准,也很好理解,但有些慢。下面的方法显然要省时,简单一些。 -----------------------------------------------------华丽的下划线-------------------------------------------------------- 还以这幅图为例 我们把这颗树以根节点为起点圈起来。 当这条线经过一个节点的前方时,则这个点为前序遍历的一个点。 当这条线经过一个节点的中间时,则这个点为中序遍历的一个点。 当这条线经过一个节点的后方时,则这个点为后序遍历的一个点。 还以中序遍历为例,经过点的顺序为BDCEHGKF。 高 端大气上档次, 我用这个方法压线过了初赛。 不要问我原理,我也不知道。 来源: https://www.cnblogs.com

数据结构学习--Java遍历二叉树

柔情痞子 提交于 2019-12-03 23:56:29
一、遍历树 遍历树是根据一个特定的顺序访问树的每一个节点,根据顺序的不同分为前序、中序、后序遍历三种。 二、前序遍历   1、访问根节点   2、前序遍历左子树   3、前序遍历右子树 三、中序遍历   1、中序遍历左子树   2、访问根节点   3、中序遍历右子树 四、后序遍历   1、后序遍历左子树   2、后序遍历右子树   3、访问根节点 代码实现 package com.example.deer;public class Tree { //根节点 public Node root; /** * 插入节点 * @param value */ public void insert(long value,String sValue){ //封装节点 Node newNode = new Node(value,sValue); //引用当前节点 Node current = root; //引用父节点 Node parent; //如果root为null,也就是第一次插入的时候 if(root == null){ root = newNode; return; }else{ while (true){ //父节点指向当前节点 parent = current; //如果当前指向的节点数据比插入的要大,则向左走 if(current.data > value){ current =

二叉树的存储结构以及遍历

依然范特西╮ 提交于 2019-12-03 23:45:35
一、二叉树的存储结构 ————顺序存储(一维数组)——— 1 #define MaxSize 100 //假设二叉树最大编号为99 2 typedef char DataType; //定义二叉树节点的数据类型,假设为char型 3 typedef struct{ 4 DataType data[MaxSize]; 5 int biTreeNum; //二叉树的节点个数 6 }SeqBiTree; ——————二叉链表———————— 1 typedef char DataType; 2 typedef struct BiNode{ 3 DataType data; 4 struct BiNode * lchild,* rchild; 5 }BiNode; 二、二叉树的遍历 遍历过程 转载自https://mp.weixin.qq.com/s/HXce4H21Gbu_O9ciXzJQYw ————深度优先遍历———— 1.前序遍历 2.中序遍历 3.后序遍历 ————广度优先遍历———— 4.层序遍历 总结:a.我们提到的四种遍历方式,其实都是在把树种的结点编程某种意义上的线性序列,这样给程序执行带来了好处。 b.前序、中序、后序遍历最根本的区别就是双亲结点的访问时机——前序是先访问双亲结点,然后左孩子,最后右孩子;中序是左孩子,双亲,右孩子;后序是左孩子、右孩子最后双亲结点。 c

面试准备 | 树相关的总结整理

前提是你 提交于 2019-12-03 21:33:19
树的遍历 前中后序遍历的6种实现方法(每种都有递归和循环两种)。 https://blog.csdn.net/liujiayu1015/article/details/52535829 剑指offer T26 34 55 7 33 (P62) 层序遍历:T32 二叉搜索树:左<根<右,O(logn)实现搜索,T36 68 堆和红黑树:堆分为最大堆和最小堆(快速查找最大、最小值)。 红黑树:把树中的节点定义为红、黑两种颜色,通过规则确保从根节点到叶节点的最长路径的长度不超过最短路径的两倍。 C++的STL基于红黑树的结构:set multiset map multimap 等 unordered_map? T40 来源: https://www.cnblogs.com/shona/p/11809684.html

二叉树的广义表创建及中序遍历、后序遍历、层次遍历的非递归算法(C语言)

北战南征 提交于 2019-12-03 07:40:14
广义表创建二叉树 关于用广义表的形式表示二叉树的形式如下 ①广义表中的一个字母代表一个结点的数据信息。 ②每个根结点作为由子树构成的表的名字放在义表的前面。 ③每个结点的左子树与右子树之间用逗号分开。若结点只有右子树面无左子树,则该逗号不能省略。 ④在整个广义表的末尾加一个特殊符号(如“@”)作为结束标志。 下面先用自然语言描述算法如下。 依次从广义表中取得-个元素,并对取得的元素做如下相应的处理。 ①若当前取得的元素为字母,则按如下规则建立一个新的(链)结点。 a)若该结点为二叉树的根结点,则将该结点的地址送T。 b)若该结点不是二叉树的根结点,则将该结点作为左孩子(若标志flag为1)或者右子若标志flag为2)链接到其双亲结点上(此时双亲结点的地址在栈顶位置)。 ②若当前取得的元素为左括号“(”,则表明一个子表开始,将标志flag置为1,同时将面那个结点的地址进栈。 ③若当前取得的元素为右括号“)”,则表明一个子表结束,做退栈操作。 ④若当前取得的元素为逗号,则表明以左孩子为根的子树处理完毕,接着应该处理孩子为根的子树,将标志flag置为2。 如此处理广义表中的每一个元素,直到取得广义表的结束符号“@”为止。 二叉树的中序遍历(非递归) 算法的核心思想是: 当P所指的结点不为空时.则将该结点所在链结点的地址进栈,然后再将”指向该结点的左孩子结点

C++二叉树的遍历:深度优先(前序、中序、后序)和广度优先(层次)

末鹿安然 提交于 2019-12-03 04:31:05
准备 深度优先遍历:沿着每一个分支路径进行深入访问。前序、中序、后序都是深度优先遍历的特例。可以用递归实现,非递归一般借助栈容器。 广度优先遍历:又叫层次遍历,对每一层依次访问。可以借助队列容器来实现。 先定义和创建一颗二叉树 #include <iostream> #include <vector> #include <queue> #include <stack> //定义二叉树结点 template<typename T> struct Node { T value; Node<T> *left; Node<T> *right; Node(const T &val) :value(val), left(nullptr), right(nullptr) {} Node(const T &val, Node<T> *&lnode, Node<T> *&rnode) :value(val), left(lnode), right(rnode) {} }; //创建二叉树 template<typename T> Node<T>* createBinaryTree(const std::initializer_list<T> &list) { std::vector<Node<T>*> vec; for (auto &item : list) { Node<T> *newNode =

【大话数据结构】二叉树的遍历(前序 中序 后续 层次 深度优先 广度优先 DFS BFS)

自古美人都是妖i 提交于 2019-12-03 04:30:39
书籍推荐 《大话数据结构》—— https://www.loneway.ren/book/detail/20006 二叉树的遍历 二叉树的遍历方式有两类:深度优先遍历和广度优先遍历。 深度优先遍历 深度优先遍历是指顺着某一条路径尽可能的向前探索,必要的时候(探索到叶子节点)回溯。 遍历顺序: 先根序遍历(DLR) 中根序遍历(LDR) 后根序遍历(LRD) 实现方法: 递归方法 给定一个二叉树,返回它的中序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def inorderTraversal(self, root): """ :type root: TreeNode :rtype: List[int] """ assert isinstance

二叉树遍历(前序、中序、后序、层次、深度优先)递归和非递归 java实现

五迷三道 提交于 2019-12-03 04:30:20
二叉树是一种非常重要的数据结构,非常多其他数据结构都是基于二叉树的基础演变而来的。对于二叉树, 有深度遍历 和 广度遍历 ,深度遍历有 前序、中序以及后序 三种遍历方法,广度遍历即我们寻常所说的 层次遍历 。由于树的定义本身就是递归定义,因此採用递归的方法去实现树的三种遍历不仅easy理解并且代码非常简洁,而对于广度遍历来说,须要其他数据结构的支撑。比方堆了。 四种基本的遍历思想为: 前序遍历:根结点 —> 左子树 —> 右子树 中序遍历:左子树—> 根结点 —> 右子树 后序遍历:左子树 —> 右子树 —> 根结点 层次遍历:仅仅需按层次遍历就可以 比如。求以下二叉树的各种遍历 1 / \ 2 3 / \ / 4 5 6 / \ 7 8 前序遍历:1 2 4 5 7 8 3 6 中序遍历:4 2 7 5 8 1 6 3 后序遍历:4 7 8 5 2 6 3 1 层次遍历:1 2 3 4 5 6 7 8 二叉树的代码 public class TreeNode { public int val ; public TreeNode left , right ; public TreeNode ( int val ) { this . val = val ; this . left = this . right = null ; } } 一、前序遍历 1)依据上文提到的遍历思路:根结点

二叉树的深度优先遍历和广度优先遍历

你离开我真会死。 提交于 2019-12-03 04:30:07
1. 分析 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历、中序遍历、后序遍历。具体说明如下: 先序遍历:对任一子树,先访问根,然后遍历其左子树,最后遍历其右子树。 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树。 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。 广度优先遍历:又叫层次遍历,从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问结点,访问完一层就进入下一层,直到没有结点可以访问为止。 2. 举例说明 对下图所示的二叉排序树进行遍历,要求使用先序遍历(递归、非递归)、中序遍历(递归、非递归)、后序遍历(递归、非递归)和广度优先遍历。 2.1 参考代码 package BinaryTreeTraverseTest; import java.util.LinkedList; import java.util.Queue; /** * 二叉树的深度优先遍历和广度优先遍历 * @author Fantasy * @version 1.0 2016/10/05 - 2016/10/07 */ public class