Skip to content

Commit a8beb2f

Browse files
committed
add leetcode: offer-16
1 parent 5c52912 commit a8beb2f

File tree

4 files changed

+78
-11
lines changed

4 files changed

+78
-11
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package offer;
2+
3+
/**
4+
* @author : CodeWater
5+
* @create :2022-07-12-20:59
6+
* @Function Description :16.数值的整数次方
7+
*/
8+
public class _16NumbericalInteger {
9+
class Solution {
10+
public double myPow(double x, int n) {
11+
if( x == 0 ) return 0;
12+
/*Java 代码中 int32 变量n∈[−2147483648,2147483647] ,因此当 n = -2147483648 时执行
13+
n = -n会因越界而赋值出错。解决方法是先将 n 存入 long 变量 b ,后面用 b 操作即可。
14+
*/
15+
long b = n;
16+
double res = 1.0;
17+
if( b < 0 ){
18+
x = 1 / x ;
19+
b = -b;
20+
}
21+
while( b > 0 ){
22+
if( (b & 1) == 1 ) res *= x;
23+
x *= x;
24+
b >>= 1;
25+
}
26+
return res;
27+
}
28+
}
29+
}

Algorithm/src/offer/_7BuildTree.java

+49-11
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,18 @@ public class _7BuildTree {
1515
// 键为结点元素值;值为结点下标
1616
private Map<Integer, Integer> indexMap;
1717

18+
public TreeNode buildTree(int[] preorder, int[] inorder) {
19+
int n = preorder.length;
20+
// 构造哈希映射,帮助我们快速定位根节点
21+
indexMap = new HashMap<Integer, Integer>();
22+
for (int i = 0; i < n; i++) {
23+
// 把数组值当做键;下标当做值;这样后面求左子树结点数可以
24+
indexMap.put(inorder[i], i);
25+
}
26+
// 传入的参数是先序和后序的下标;其实也就相当于一段范围内二叉树的范围
27+
return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1);
28+
}
29+
1830
// 按照的层次遍历序列输出的;参数都是下标索引,这样好理解
1931
public TreeNode myBuildTree(int[] preorder, int[] inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right) {
2032
// 超出范围,空
@@ -40,19 +52,45 @@ public TreeNode myBuildTree(int[] preorder, int[] inorder, int preorder_left, in
4052
return root;
4153
}
4254

43-
public TreeNode buildTree(int[] preorder, int[] inorder) {
44-
int n = preorder.length;
45-
// 构造哈希映射,帮助我们快速定位根节点
46-
indexMap = new HashMap<Integer, Integer>();
47-
for (int i = 0; i < n; i++) {
48-
// 把数组值当做键;下标当做值;这样后面求左子树结点数可以
49-
indexMap.put(inorder[i], i);
50-
}
51-
// 传入的参数是先序和后序的下标;其实也就相当于一段范围内二叉树的范围
52-
return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1);
53-
}
5455

56+
//==========================另外一种============================
57+
/**
58+
* Definition for a binary tree node.
59+
* public class TreeNode {
60+
* int val;
61+
* TreeNode left;
62+
* TreeNode right;
63+
* TreeNode(int x) { val = x; }
64+
* }
65+
*/
66+
class Solution {
67+
// 声明成员变量,方便在递归创建时使用
68+
int[] preorder ;
69+
// 键是结点值 , 值是结点在中序中的下标。 方便在创建过程中确定左右子树范围
70+
Map<Integer , Integer> dic = new HashMap<>();
71+
public TreeNode buildTree(int[] preorder, int[] inorder) {
72+
this.preorder = preorder;
73+
for( int i = 0 ; i < inorder.length ; i++ ){
74+
dic.put( inorder[i] , i );
75+
}
76+
// 初始从root开始(0),范围是是整个中序范围
77+
return recursion( 0 , 0 , inorder.length - 1 );
78+
}
5579

80+
// 从前序中确定根结点root,从中序中确定左右子树的范围(left,right)。 (root,left,right都是数组中的下标)
81+
public TreeNode recursion( int root , int left , int right ){
82+
// 左子树下标超过右子树,递归结束
83+
if( left > right ) return null;
84+
// 找到划分左右子树的根结点
85+
TreeNode node = new TreeNode( preorder[root] );
86+
// 找到根结点在先序中的下标
87+
int i = dic.get( preorder[root] );
88+
// 递归查找左右子树的根结点,同时创捷左右指针
89+
node.left = recursion( root + 1 , left , i - 1 );
90+
node.right = recursion( root + i - left + 1 , i + 1 , right );
91+
return node;
92+
}
93+
}
5694
}
5795

5896
class TreeNode {
-357 Bytes
Binary file not shown.
-1.49 KB
Binary file not shown.

0 commit comments

Comments
 (0)