剑指offer-day20
重建二叉树
又是一道知道思路但是不知道怎么实现的题目,直接放答案吧。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
class Solution { int[] preorder; Map<Integer, Integer> inorderMap = new HashMap<>(); public TreeNode buildTree(int[] preorder, int[] inorder) { this.preorder = preorder; for(int i = 0; i < inorder.length; i++){ inorderMap.put(inorder[i], i); } return recur(0, 0, inorder.length - 1); }
public TreeNode recur(int root, int left, int right){ if(left > right){ return null; } int i = inorderMap.get(preorder[root]); TreeNode node = new TreeNode(preorder[root]); node.left = recur(root + 1, left, i-1); node.right = recur(root + 1 + i - left, i+1, right); return node; } }
|
数值的整次方
如果用简单的迭代会超时,就是摆明了不准用迭代,正确的方式是用变化的二分法,每次将幂数折半,将要累乘的数换成该数的二次方,如果幂数是奇数的话就把多出来的一个数乘进返回值里。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public double myPow(double x, int n) { double res = 1; long b = n; if(b < 0){ b = -b; x = 1 / x; } while(b > 0){ if(b % 2 == 1){ res *= x; } x *= x; b /= 2; } return res; } }
|
二叉搜索树的后序遍历序列
完全不会,直接放答案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Solution { public boolean verifyPostorder(int[] postorder) { Stack<Integer> stack = new Stack<>(); int root = Integer.MAX_VALUE; for(int i = postorder.length - 1; i >= 0; i--) { if(postorder[i] > root) return false; while(!stack.isEmpty() && stack.peek() > postorder[i]) root = stack.pop(); stack.add(postorder[i]); } return true; } }
|