博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法题解之二叉树与分治法
阅读量:5367 次
发布时间:2019-06-15

本文共 3981 字,大约阅读时间需要 13 分钟。

Different Ways to Add Parentheses

加括号的不同方式

思路:分治地求出一个运算符的左边部分和右边部分的结果,将它们两两组合运算。优化的方式是用一个hash表记录所有字串的中间结果,避免重复计算。

1 public class Solution { 2     Map
> map = new HashMap
>(); 3 public List
diffWaysToCompute(String input) { 4 if (map.containsKey(input)) { 5 return map.get(input); 6 } 7 8 List
res = new ArrayList
(); 9 if (!(input.contains("+") || input.contains("-") || input.contains("*"))) {10 res.add(Integer.parseInt(input));11 map.put(input, res);12 return res;13 }14 for (int i = 0; i < input.length(); i++) {15 char c = input.charAt(i);16 if (c == '+' || c == '-' || c == '*') {17 String p1 = input.substring(0, i);18 String p2 = input.substring(i + 1, input.length());19 List
res1 = diffWaysToCompute(p1);20 List
res2 = diffWaysToCompute(p2);21 22 for (int n1 : res1) {23 for (int n2 : res2) {24 if (c == '+') {25 res.add(n1 + n2);26 } else if (c == '-') {27 res.add(n1 - n2);28 } else if (c == '*') {29 res.add(n1 * n2);30 }31 }32 }33 }34 }35 map.put(input, res);36 return res;37 }38 }
View Code

 

 

Invert Binary Tree

反转二叉树

思路1:虽然很简单但是听说homebrew的作者因为没做出这题被谷歌fuck off 了。。所以还是做下吧。。

1 public class Solution { 2     public TreeNode invertTree(TreeNode root) { 3         if (root == null) { 4             return null; 5         } 6         TreeNode left = root.left; 7         TreeNode right = root.right; 8         root.left = invertTree(right); 9         root.right = invertTree(left);10         return root;11     }12 }
View Code

思路2:非递归版。用队列做bfs,把每个节点的左右儿子互换。

1 public class Solution { 2     public TreeNode invertTree(TreeNode root) { 3         if (root == null) { 4             return null; 5         } 6         Queue
q = new LinkedList
(); 7 q.offer(root); 8 while (!q.isEmpty()) { 9 TreeNode cur = q.poll();10 TreeNode left = cur.left;11 TreeNode right = cur.right;12 cur.left = right;13 cur.right = left;14 if (left != null) {15 q.offer(left);16 }17 if (right != null) {18 q.offer(right);19 }20 }21 return root;22 }23 }
View Code

 

 

Kth Smallest Element in a BST

二叉树的第k小元素

思路:熟悉二叉树中序遍历的非递归版,这道题就很好做。首先找到最小元素,一定是沿着左子树走到头,然后找次小元素,如果最小节点有右子树,则相当于找右子树的最小元素,如果没有则次小元素为最小元素的父亲。之后的k个元素都这么找。

1 public class Solution { 2     public int kthSmallest(TreeNode root, int k) { 3         Stack
s= new Stack
(); 4 TreeNode cur = root; 5 while (cur != null) { 6 s.push(cur); 7 cur = cur.left; 8 } 9 10 cur = s.pop();11 for (int i = 2; i <= k; i++) {12 if (cur.right != null) {13 cur = cur.right;14 while (cur != null) {15 s.push(cur);16 cur = cur.left;17 }18 }19 cur = s.pop();20 }21 return cur.val;22 }23 24 }
View Code

 

 

Lowest Common Ancestor of a Binary Search Tree

二叉查找树的最近公共祖先

思路:与二叉树LCA一样,都是讨论两个节点都在左子树,都在右子树,分别在两边这三种情况。

1 public class Solution { 2     public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { 3         if (root == null || p == null || q == null) { 4             return null; 5         } 6         if (p.val < root.val && q.val < root.val) { 7             return lowestCommonAncestor(root.left, p, q); 8         } 9         if (p.val > root.val && q.val > root.val) {10             return lowestCommonAncestor(root.right, p, q);11         }12         return root;13         14     }15 }
View Code

 

转载于:https://www.cnblogs.com/coldyan/p/6070081.html

你可能感兴趣的文章
egret3D与2D混合开发,画布尺寸不一致的问题
查看>>
浅谈性能测试
查看>>
较快的maven的settings.xml文件
查看>>
随手练——HDU 5015 矩阵快速幂
查看>>
Java变量类型,实例变量 与局部变量 静态变量
查看>>
Python环境搭建(安装、验证与卸载)
查看>>
一个.NET通用JSON解析/构建类的实现(c#)
查看>>
如何辨别一个程序员的水平高低?是靠发量吗?
查看>>
linux的子进程调用exec( )系列函数
查看>>
zju 2744 回文字符 hdu 1544
查看>>
【luogu P2298 Mzc和男家丁的游戏】 题解
查看>>
前端笔记-bom
查看>>
上海淮海中路上苹果旗舰店门口欲砸一台IMAC电脑维权
查看>>
给mysql数据库字段值拼接前缀或后缀。 concat()函数
查看>>
迷宫问题
查看>>
【FZSZ2017暑假提高组Day9】猜数游戏(number)
查看>>
练习10-1 使用递归函数计算1到n之和(10 分
查看>>
Oracle MySQL yaSSL 不明细节缓冲区溢出漏洞2
查看>>
Code Snippet
查看>>
zoj 1232 Adventure of Super Mario
查看>>