Skip to content

Commit c980520

Browse files
committed
树的算法,非递归的遍历,二叉搜索树相关算法
1 parent b101d0a commit c980520

9 files changed

+254
-1
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package 数据结构..BST;
2+
3+
import 数据结构..TreeNode;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
/**
9+
* Created by 周杰伦 on 2018/4/25.
10+
*/
11+
public class BST中和为给定值的两个节点 {
12+
public boolean findTarget(TreeNode root, int k) {
13+
if (root == null)return false;
14+
List<Integer> list = inorder(root, new ArrayList<>());
15+
int left = 0;
16+
int right = list.size() - 1;
17+
while (left < right) {
18+
if (list.get(left) + list.get(right) > k) {
19+
right --;
20+
}else if(list.get(left) + list.get(right) < k) {
21+
left ++;
22+
}else return true;
23+
}
24+
return false;
25+
}
26+
public List<Integer> inorder(TreeNode root, List<Integer> list) {
27+
if (root == null) return list;
28+
inorder(root.left, list);
29+
list.add(root.val);
30+
inorder(root.right, list);
31+
return list;
32+
}
33+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package 数据结构..BST;
2+
3+
import 数据结构..TreeNode;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
/**
9+
* Created by 周杰伦 on 2018/4/25.
10+
*/
11+
public class 在BST中查找两个节点之差的最小绝对值 {
12+
public int getMinimumDifference(TreeNode root) {
13+
List<Integer> list = inorder(root, new ArrayList<>());
14+
int min = Integer.MAX_VALUE;
15+
for (int i = 1;i < list.size();i ++) {
16+
if (Math.abs(list.get(i) - list.get(i - 1)) < min) {
17+
min = Math.abs(list.get(i) - list.get(i - 1));
18+
}
19+
}
20+
return min;
21+
}
22+
public List<Integer> inorder(TreeNode root, List<Integer> list) {
23+
if (root == null) return list;
24+
inorder(root.left, list);
25+
list.add(root.val);
26+
inorder(root.right, list);
27+
return list;
28+
}
29+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package 数据结构..BST;
2+
3+
import 数据结构..TreeNode;
4+
5+
import java.util.*;
6+
7+
/**
8+
* Created by 周杰伦 on 2018/4/25.
9+
*/
10+
public class 寻找BST中出现次数最多的节点 {
11+
public int[] findMode(TreeNode root) {
12+
ArrayList<Integer> res = new ArrayList<>();
13+
List<Integer> list = inorder(root, new ArrayList<>());
14+
HashMap<Integer, Integer> map = new HashMap<>();
15+
int max = 0;
16+
for (int i : list) {
17+
if (map.containsKey(i)) {
18+
map.put(i, map.get(i) + 1);
19+
max = Math.max(max,map.get(i));
20+
}else {
21+
map.put(i,1);
22+
max = Math.max(max,map.get(i));
23+
}
24+
}
25+
Set<Integer> set = map.keySet();
26+
for (int i : set) {
27+
if (map.get(i) == max) {
28+
res.add(i);
29+
}
30+
}
31+
int []arr = new int[res.size()];
32+
int index = 0;
33+
for (int i : res) {
34+
arr[index ++] = i;
35+
}
36+
return arr;
37+
}
38+
public List<Integer> inorder(TreeNode root, List<Integer> list) {
39+
if (root == null) return list;
40+
inorder(root.left, list);
41+
list.add(root.val);
42+
inorder(root.right, list);
43+
return list;
44+
}
45+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package 数据结构..BST;
2+
3+
import 数据结构..TreeNode;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
/**
9+
* Created by 周杰伦 on 2018/4/25.
10+
*/
11+
public class 寻找BST的第k个元素 {
12+
public int kthSmallest(TreeNode root, int k) {
13+
if (root == null) return 0;
14+
List<Integer> list = inorder(root, new ArrayList<>());
15+
return list.get(k - 1);
16+
}
17+
18+
public List<Integer> inorder(TreeNode root, List<Integer> list) {
19+
if (root == null) return list;
20+
inorder(root.left, list);
21+
list.add(root.val);
22+
inorder(root.right, list);
23+
return list;
24+
}
25+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package 数据结构..BST;
2+
3+
import 数据结构..TreeNode;
4+
5+
/**
6+
* Created by 周杰伦 on 2018/4/25.
7+
*/
8+
public class 把BST每个节点的值都加上比它大的节点的值 {
9+
//先遍历右子树,再遍历根节点,再遍历左子树,就是从大到小遍历,
10+
// 每个遍历到的值加上之前的和就是新的值
11+
public TreeNode convertBST(TreeNode root) {
12+
if (root == null) return null;
13+
int sum = 0;
14+
convertBST(root.right);
15+
sum += root.val;
16+
root.val = sum;
17+
convertBST(root.left);
18+
return root;
19+
}
20+
}

src/数据结构/树/遍历/间隔遍历.java renamed to src/数据结构/树/层次遍历/间隔遍历.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package 数据结构..遍历;
1+
package 数据结构..层次遍历;
22

33
import 数据结构..TreeNode;
44

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package 数据结构..遍历;
2+
3+
import 数据结构..TreeNode;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
import java.util.Stack;
8+
9+
/**
10+
* Created by 周杰伦 on 2018/4/25.
11+
*/
12+
public class 中序非递归 {
13+
public List<Integer> inorderTraversal(TreeNode root) {
14+
if (root == null) return new ArrayList<>();
15+
Stack<TreeNode> stack = new Stack<>();
16+
List<Integer> list = new ArrayList<>();
17+
TreeNode p = root;
18+
stack.push(p);
19+
//p.left代表新进栈的值,stack里的是原来待遍历的值,两边都为空时说明遍历结束。
20+
while (p.left != null || !stack.isEmpty()) {
21+
//先把左子树的节点进栈。
22+
while (p.left != null) {
23+
p = p.left;
24+
stack.push(p);
25+
}
26+
//左下角节点出栈并访问,如果他有右子树,右子树进栈,并且退出循环
27+
//进入第一个环节,将该右子树节点的所有左节点进栈,以此类推即可完成。
28+
while (!stack.isEmpty()) {
29+
TreeNode t = stack.pop();
30+
list.add(t.val);
31+
if (t.right != null) {
32+
stack.push(t.right);
33+
p = t.right;
34+
break;
35+
}
36+
}
37+
}
38+
return list;
39+
}
40+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package 数据结构..遍历;
2+
3+
import 数据结构..TreeNode;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
import java.util.Stack;
8+
9+
/**
10+
* Created by 周杰伦 on 2018/4/25.
11+
*/
12+
public class 先序非递归 {
13+
public List<Integer> preorderTraversal(TreeNode root) {
14+
if (root == null) return new ArrayList<>();
15+
Stack<TreeNode> stack = new Stack<>();
16+
List<Integer> list = new ArrayList<>();
17+
stack.push(root);
18+
while (!stack.isEmpty()) {
19+
TreeNode t = stack.pop();
20+
list.add(t.val);
21+
if (t.right != null) {
22+
stack.push(t.right);
23+
}
24+
if (t.left != null) {
25+
stack.push(t.left);
26+
}
27+
}
28+
return list;
29+
}
30+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package 数据结构..遍历;
2+
3+
import 数据结构..TreeNode;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
import java.util.Stack;
8+
9+
/**
10+
* Created by 周杰伦 on 2018/4/25.
11+
*/
12+
public class 后序非递归 {
13+
public List<Integer> postorderTraversal(TreeNode root) {
14+
if (root == null) return new ArrayList<>();
15+
Stack<TreeNode> stack = new Stack<>();
16+
List<Integer> list = new ArrayList<>();
17+
recur(stack, root);
18+
while (!stack.isEmpty()) {
19+
list.add(stack.pop().val);
20+
}
21+
return list;
22+
}
23+
24+
public void recur (Stack<TreeNode> stack, TreeNode root) {
25+
if (root == null) return;
26+
stack.push(root);
27+
recur(stack, root.right);
28+
recur(stack, root.left);
29+
return;
30+
}
31+
}

0 commit comments

Comments
 (0)