【算法总结】Binary Tree & Binary Search Tree 二叉树
2016-02-22 16:03
369 查看
描述:
树的问题主要集中在特定条件下遍历travelsal (pre-order 中->左->右 ; inorder 左->中->右; post-order 左->右->中), 二分查找树 binary search tree。Binary Search Tree: 为root左边为小于它的值,右边为大于它的node.
例题:
二叉树的查找及遍历:
Path Sum
Symmetric Tree
Binary Tree Inorder
Traversal
Binary Tree
Level Order Traversal
Binary Search Tree:
Validate
Binary Search Tree
Convert
Sorted List to Binary Search Tree
找最小公共祖先:
Lowest
Common Ancestor of a Binary Tree
解决方法:
遍历:
DFS: 迭代的话用stack, 或者用递归来模仿stack。
BFS:层序遍历,往往用queue
BST: 利用BST inorder遍历为增序序列。
复杂度:
遍历时间复杂度O(n)n为node的数量
空间复杂度为stack的大小,树的高度O(logn)
代码模板示例:
迭代 stack
Divide & Conquer 递归
层序遍历 BFS
树的问题主要集中在特定条件下遍历travelsal (pre-order 中->左->右 ; inorder 左->中->右; post-order 左->右->中), 二分查找树 binary search tree。Binary Search Tree: 为root左边为小于它的值,右边为大于它的node.
例题:
二叉树的查找及遍历:
Path Sum
Symmetric Tree
Binary Tree Inorder
Traversal
Binary Tree
Level Order Traversal
Binary Search Tree:
Validate
Binary Search Tree
Convert
Sorted List to Binary Search Tree
找最小公共祖先:
Lowest
Common Ancestor of a Binary Tree
解决方法:
遍历:
DFS: 迭代的话用stack, 或者用递归来模仿stack。
BFS:层序遍历,往往用queue
BST: 利用BST inorder遍历为增序序列。
复杂度:
遍历时间复杂度O(n)n为node的数量
空间复杂度为stack的大小,树的高度O(logn)
代码模板示例:
迭代 stack
<pre name="code" class="java">public ArrayList<Integer> preorderTraversal(TreeNode root) { ArrayList<Integer> res = new ArrayList<Integer>(); if(root == null) return res; LinkedList<TreeNode> stack = new LinkedList<TreeNode>(); while(root!=null || !stack.isEmpty()) { if(root!=null) { stack.push(root); res.add(root.val); root = root.left; } else { root = stack.pop(); root = root.right; } } return res; }
Divide & Conquer 递归
public ArrayList<Integer> preorderTraversal(TreeNode root) { ArrayList<Integer> result = new ArrayList<Integer>(); // null or leaf if (root == null) { return result; } // Divide ArrayList<Integer> left = preorderTraversal(root.left); ArrayList<Integer> right = preorderTraversal(root.right); // Conquer result.add(root.val); result.addAll(left); result.addAll(right); return result; }
层序遍历 BFS
public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) { // write your code here ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>(); if(root == null){ return res; } LinkedList<TreeNode> queue = new LinkedList<TreeNode>(); queue.offer(root); while(!queue.isEmpty()){ ArrayList<Integer> level = new ArrayList<Integer>(); int size = queue.size(); for(int i=0; i<size; i++){ TreeNode node = queue.poll(); level.add(node.val); if(node.left!=null){ queue.offer(node.left); } if(node.right != null){ queue.offer(node.right); } } res.add(level); } return res; }
相关文章推荐
- 命令行快速技巧:如何定位一个文件
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- jquery+CSS实现的多级竖向展开树形TRee菜单效果
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析