中序遍历

第94题:二叉树的中序遍历

回眸只為那壹抹淺笑 提交于 2019-12-02 22:22:46
一. 问题描述 给定一个二叉树,返回它的中序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 二. 解题思路 本体思路:采用迭代的方法对二叉树进行遍历。 步骤一:建立一个空栈和一个list表,将temp节点指向根节点。 步骤二:判断temp是否为空?否则将根节点入栈,并将temp指向根节点的左子节点。(重复直到找到最左子节点) 步骤三:栈中取出最新节点,将数值记录下来,将temp指向该节点的右子节点,返回步骤二。 步骤四:知道栈为空,则遍历结束,将数值结果输出。 三. 执行结果 执行用时 :1 ms, 在所有 java 提交中击败了96.10%的用户 内存消耗 :34.8 MB, 在所有 java 提交中击败了39.36%的用户 四. Java代码 class Solution { public List<Integer> inorderTraversal(TreeNode root) { TreeNode temp=root; List<Integer> result=new ArrayList<Integer>(); List<TreeNode> zhan=new ArrayList<TreeNode>(); while(true){ if(temp!=null){ zhan

js 二叉树遍历

匿名 (未验证) 提交于 2019-12-02 21:53:52
二叉树定义这里不再赘述。 我这里有个二叉树: var tree = { "id": 0, "name": "root", "left": { "id": 1, "name": "Simon", "left": { "id": 3, "name": "Carl", "left": { "id": 7, "name": "Lee", "left": { "id": 11, "name": "Fate" } }, "right": { "id": 8, "name": "Annie", "left": { "id": 12, "name": "Saber" } } }, "right": { "id": 4, "name": "Tony", "left": { "id": 9, "name": "Candy" } } }, "right": { "id": 2, "name": "right", "left": { "id": 5, "name": "Carl", }, "right": { "id": 6, "name": "Carl", "right": { "id": 10, "name": "Kai" } } } }; 1.使用前序遍历,并将所有name输出。 function getListWithDLR(node) { if(node){ console.log(node

二叉树的建立和遍历

拜拜、爱过 提交于 2019-12-02 18:46:59
二叉树(Binary Tree)是n(n >= 0)个节点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根节点和两颗互不相交的,分别称为根节点的左子树和右子树的二叉树组成。 二叉嘛,也就是每个节点最多有两个分支。 图示: 二叉树具有五种基本形态: 1.空二叉树 2.只有一个根节点 3.根节点只有左子树 4.根节点只有右子树 5.根节点既有左子树又有右子树 特殊的二叉树: 1.斜树(只有左子树的称为左斜树,只有右子树的称为右斜树,两者统称为斜树) 2.满二叉树(所有的分支节点都存在左子树和右子树,并且所得树叶都在同一层上) 3.完全二叉树的特征: 1.叶子结点只能出现在最下两层 2.最下层的叶子一定集中在左部连续位置 3.倒数二层,若有叶子结点,一定都在右部连续位置 4.如果节点度为1(这里的度与离散数学中的度不一样,这里的度是指节点所拥有的子树数),则该节点只有左孩子,即不存在只有右子树的情况 5.同样节点数的二叉树,完全二叉树的深度最小 二叉树的性质: 性质1:在二叉树的第i层上至多有2^(i - 1)个节点(i >= 1) 性质2:深度为k的二叉树至多有2^k - 1个节点(k >= 1) 性质3:对任何一颗二叉树T,如果其终端节点数为n0,度为2的节点数为n2,则n0 = n2 + 1 性质4:具有n个节点的完全二叉树的深度为[log2n] + 1([

LeetCode解题汇总目录

a 夏天 提交于 2019-12-02 17:37:52
此篇为学习完 《数据结构与算法之美》 后,在 LeetCode 刷题的汇总目录,方便大家查找(Ctrl+F ind ),一起刷题,一起PK交流!Updated on 2019.12.2 刷题可以按照 不同的专题 进行,便于加强某个知识点的理解。 我的 LeetCode 主页 我的 GitHub 主页 已解决 519/1185 - 简单 281 中等 208 困难 30 2019.7.24 - 2019.11.9,108天做了400道题 2019.11.9 - 2019.11.24, AC+100道,4个月共计500道题 参赛记录 LeetCode 2019 力扣杯全国秋季编程大赛 ​ 已解题目,部分太简单的没有列出 LeetCode 1. 两数之和(哈希) LeetCode 2. 两数相加(单链表反转) LeetCode 3. 无重复字符的最长子串(滑动窗口+哈希) LeetCode 4. 寻找两个有序数组的中位数(二分查找,难) LeetCode 7. 整数反转 LeetCode 8. 字符串转换整数 (atoi) LeetCode 9. 回文数 LeetCode 11. 盛最多水的容器(双指针) LeetCode 14. 最长公共前缀 LeetCode 15. 三数之和 LeetCode 16. 最接近的三数之和(固定左端+滑动窗口) LeetCode 17.

二叉树的遍历

烈酒焚心 提交于 2019-12-02 12:25:28
递归遍历 前序 //前序遍历 void PreOrder(BTnode *pnode) { if (pnode) { visit(pnode); PreOrder(bnode->left); PreOrder(bnode->right); } } 中序 //中序遍历 void InOrder(BTnode *pnode) { if (pnode) { InOrder(pnode->left); 递归遍历 visit(pnode); InOrder(pnode->right); } } 后序 //后序遍历 void PostOrder(BTnode *pnode) { if (pnode) { PostOrder(pnode->left); PostOrder(pnode->right); visit(pnode); } } 非递归遍历 前序 ​ 先访问根节点,再将其入栈,以便之后返回,就这样一直遍历到左子树最下面,然后出栈,进入右子树,继续开始遍历。 //前序遍历 void PreOrder1(BTnode *pnode) { stack<*BTnode> s; BTnode *p = pnode; while (p || !s.empty()) { while (p) { visit(p); //先访问根节点,再入栈 s.push(p); p = p->left; /

与世无争的帅哥 提交于 2019-12-02 11:42:39
树的介绍 1. 树的定义 树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。 把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: (01) 每个节点有零个或多个子节点; (02) 没有父节点的节点称为根节点; (03) 每一个非根节点有且只有一个父节点; (04) 除了根节点外,每个子节点可以分为多个不相交的子树。 2. 树的基本术语 若一个结点有子树,那么该结点称为子树根的"双亲",子树的根是该结点的"孩子"。有相同双亲的结点互为"兄弟"。一个结点的所有子树上的任何结点都是该结点的后裔。从根结点到某个结点的路径上的所有结点都是该结点的祖先。 结点的度 :结点拥有的子树的数目。 叶子 :度为零的结点。 分支结点 :度不为零的结点。 树的度 :树中结点的最大的度。 层次 :根结点的层次为1,其余结点的层次等于该结点的双亲结点的层次加1。 树的高度 :树中结点的最大层次。 无序树 :如果树中结点的各子树之间的次序是不重要的,可以交换位置。 有序树 :如果树中结点的各子树之间的次序是重要的, 不可以交换位置。 森林 :0个或多个不相交的树组成。对森林加上一个根,森林即成为树;删去根,树即成为森林。 二叉树的介绍 1. 二叉树的定义 二叉树是每个节点最多有两个子树的树结构。它有五种基本形态:二叉树可以是空集

《剑指offer》树专题 (牛客10.25)

╄→尐↘猪︶ㄣ 提交于 2019-12-02 11:40:54
考察的知识点主要在于树的数据结构(BST,AVL)、遍历方式(前序,中序,后序,层次)、遍历算法(DFS,BFS,回溯)以及遍历时借助的数据结构如队列和栈。由于树本身就是一个递归定义的结构,所以在递归求解问题时,要善于将问题转化成合适的子问题,思考清楚子问题的形式、递归的出口、父问题与子问题的联系。 以下这些问题难度都不太大,很多都是一次过,比上次链表专题的思维难度小多了。 难度 题目 知识点 04. 重建二叉树 依据前序和中序遍历重建 , 递归 ★★ 17. 树的子结构 递归 18. 二叉树的镜像 简单递归 22. 从上往下打印二叉树 bfs , Queue的使用 23. 判断是否为二叉搜索树的后序遍历序列 BST , 递归 ★ 24. 二叉树中和为某一值的路径 dfs , 回溯 , Collections.sort() ★★ 26. 二叉搜索树与双向链表 递归 中序遍历 ★ 38. 二叉树的深度 递归 39. 平衡二叉树 平衡二叉树 递归 57. 二叉树的下一个结点 中序遍历 循环 回溯后的情况 58. 对称的二叉树 递归 可转化为非递归 59. 按之字形顺序打印二叉树 Stack 层次遍历变形 60. 把二叉树打印成多行 Queue LinkedList 层次遍历 ★★ 61. 序列化二叉树 递归 string.split() string.equals 62.

二叉树的前中后序遍历

ⅰ亾dé卋堺 提交于 2019-12-02 11:16:47
二叉树的前中后遍历,其前中后,您可理解为指的是根结点所在的序。 前序遍历:前序遍历的顺序为根-左-右 中序遍历:中序遍历的顺序为左-根-右 后序遍历:后序遍历的顺序为左-右-根 1.前序遍历 思路:利用栈后进先出的特性。 1.根结点入栈; 2.循环取栈顶元素、右子结点入栈、左子结点入栈。 JAVA参考代码 public class TreeNode { int val ; TreeNode left ; TreeNode right ; ​ TreeNode ( int val ) { this . val = val ; } } public List < Integer > preorderTree ( TreeNode root ) { Stack < TreeNode > stack = new Stack < > ( ) ; List < Integer > preorder = new ArrayList < > ( ) ; ​ if ( root == null ) { return preorder ; } ​ stack . push ( root ) ; while ( ! stack . empty ( ) ) { TreeNode node = stack . pop ( ) ; preorder . add ( node . val ) ; if (

二叉树的递归遍历(java实现)

跟風遠走 提交于 2019-12-02 11:04:30
二叉树的递归遍历(java实现) 二叉树是数据结构中非常重要的一章,而二叉树的遍历是重中之重。本文记载了我构造二叉树并对一棵简单的二叉树进行前、中、后序遍历的经验,因为本人是新手,不足之处还请谅解,欢迎指正。 创建树类 package tree ; public class BinaryTree { TreeNode root ; public BinaryTree ( ) { System . out . println ( "创建一棵树完成" ) ; } //设置根节点 public void setRoot ( TreeNode root ) { this . root = root ; System . out . println ( "在树中成功创建了一个根节点" ) ; } } 创建节点类 package tree ; public class TreeNode { //节点中具有value值,此处声明 int value ; //值的两端是左右节点的引用 TreeNode leftNode ; TreeNode rightNode ; //构造器,在声明一个节点时传值。 public TreeNode ( int value ) { this . value = value ; } //创建一个节点的左节点 public void setLeftNode (

二叉树建立与遍历

北慕城南 提交于 2019-12-02 11:04:19
1.以二叉链表表示二叉树,建立一棵二叉树; 2.输出二叉树的中序遍历结果; 3.输出二叉树的前序遍历结果; 4.输出二叉树的后序遍历结果; 5.输出二叉树的层序遍历结果。 # include <iostream> using namespace std ; typedef struct BiTNode { char data ; struct BiTNode * lchild , * rchild ; } BiTNode , * BiTree ; void CreateBiTree ( BiTree & T ) { char x ; cin >> x ; if ( '#' == x ) T = NULL ; else { T = new BiTNode ; T - > data = x ; CreateBiTree ( T - > lchild ) ; CreateBiTree ( T - > rchild ) ; } } void PreOrderTraverse ( BiTree T ) { if ( ! T ) return ; else { cout << T - > data << " " ; PreOrderTraverse ( T - > lchild ) ; PreOrderTraverse ( T - > rchild ) ; } } void