前序遍历

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

重构二叉树之前序遍历和中序遍历

我是研究僧i 提交于 2019-12-02 07:16:12
题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如输入前序遍历序列{1,2,4,7,3,5,6,8} 和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回 代码实现: /** * @param pre * 二叉树的前序遍历结果 * @param in * 二叉树的中序遍历结果 * @return root 重构完成的二叉树的根节点 */ public TreeNode reConstructBinaryTree(int[] pre, int[] in) { // 前序遍历或者中序遍历的结果已构建完, 递归退出 if (pre == null || in == null || pre.length == 0 || in.length == 0) { return null; } // 用前序遍历的结果的第一个元素, 构造二叉树的根节点 TreeNode root = new TreeNode(pre[0]); int i; // 在中序遍历的结果中,找出根节点pre[0]所在下标 for (i = 0; i < in.length; i++) { if (in[i] == pre[0]) { break; } } // 构建当前根节点的左子树时, 前序遍历的数组为pre[1..i]

LeetCode#二叉树的非递归遍历

依然范特西╮ 提交于 2019-12-02 02:35:47
二叉树的非递归遍历 **根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下: ** 对于任一结点P: 1)访问结点P,并将结点P入栈; 2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,则将P的左孩子置为当前的结点P; 3)直到P为NULL并且栈为空,则遍历结束。 ** void preOrder2(BinTree *root) //非递归前序遍历 { stack<BinTree*> s; BinTree *p=root; while(p!=NULL||!s.empty()) { while(p!=NULL) { cout<<p->data<<""; s.push(p); p=p->lchild; } if(!s.empty()) { p=s.top(); s.pop(); p=p->rchild; } } } **根据中序遍历的顺序,对于任一结点,优先访问其左孩子,而左孩子结点又可以看做一根结点,然后继续访问其左孩子结点,直到遇到左孩子结点为空的结点才进行访问,然后按相同的规则访问其右子树。因此其处理过程如下:

二叉树的遍历

廉价感情. 提交于 2019-12-01 22:12:22
二叉树的中序遍历: 迭代: class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: res,stack = [],[] while True: while root: stack.append(root) root = root.left if not stack: return res node = stack.pop() res.append(node.val) root = node.right return res 递归: class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: res = [] def helper(root): if not root: return helper(root.left) res.append(root.val) helper(root.right) helper(root) return res 另: class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: f = self.inorderTraversal return f(root.left) + [root.val]