Skip to content

Commit deb945d

Browse files
author
haotf
committed
构造二叉树
1 parent f025e1f commit deb945d

7 files changed

+346
-0
lines changed
+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* @lc app=leetcode.cn id=105 lang=java
3+
*
4+
* [105] 从前序与中序遍历序列构造二叉树
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* Definition for a binary tree node.
10+
* public class TreeNode {
11+
* int val;
12+
* TreeNode left;
13+
* TreeNode right;
14+
* TreeNode() {}
15+
* TreeNode(int val) { this.val = val; }
16+
* TreeNode(int val, TreeNode left, TreeNode right) {
17+
* this.val = val;
18+
* this.left = left;
19+
* this.right = right;
20+
* }
21+
* }
22+
*/
23+
class Solution {
24+
public TreeNode buildTree(int[] preorder, int[] inorder) {
25+
return traverse(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
26+
}
27+
28+
private TreeNode traverse(int[] preorder, int pStart, int pEnd, int[] inorder, int iStart, int iEnd) {
29+
if (pEnd < pStart || iEnd < iStart)
30+
return null;
31+
32+
int root = preorder[pStart];
33+
int index = getMaxIndex(inorder, iStart, iEnd, root);
34+
int gap = index - iStart;
35+
36+
TreeNode left = traverse(preorder, pStart + 1, pStart + gap, inorder, iStart, index - 1);
37+
TreeNode right = traverse(preorder, pStart + gap + 1, pEnd, inorder, index + 1, iEnd);
38+
39+
TreeNode node = new TreeNode(root);
40+
node.left = left;
41+
node.right = right;
42+
return node;
43+
}
44+
45+
private int getMaxIndex(int[] nums, int start, int end, int max) {
46+
int index = 0;
47+
for (int i = start; i <= end; i++) {
48+
if (nums[i] == max) {
49+
max = nums[i];
50+
index = i;
51+
break;
52+
}
53+
}
54+
return index;
55+
}
56+
}
57+
// @lc code=end
+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* @lc app=leetcode.cn id=106 lang=java
3+
*
4+
* [106] 从中序与后序遍历序列构造二叉树
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* Definition for a binary tree node.
10+
* public class TreeNode {
11+
* int val;
12+
* TreeNode left;
13+
* TreeNode right;
14+
* TreeNode() {}
15+
* TreeNode(int val) { this.val = val; }
16+
* TreeNode(int val, TreeNode left, TreeNode right) {
17+
* this.val = val;
18+
* this.left = left;
19+
* this.right = right;
20+
* }
21+
* }
22+
*/
23+
class Solution {
24+
public TreeNode buildTree(int[] inorder, int[] postorder) {
25+
return traverse(inorder, 0, inorder.length - 1, postorder, 0, postorder.length - 1);
26+
}
27+
28+
private TreeNode traverse(int[] inorder, int iStart, int iEnd, int[] postorder, int pStart, int pEnd) {
29+
if (pEnd < pStart || iEnd < iStart)
30+
return null;
31+
32+
int root = postorder[pEnd];
33+
int index = getMaxIndex(inorder, iStart, iEnd, root);
34+
int gap = index - iStart;
35+
36+
TreeNode left = traverse(inorder, iStart, index - 1, postorder, pStart, pStart + gap - 1);
37+
TreeNode right = traverse(inorder, index + 1, iEnd, postorder, pStart + gap, pEnd - 1);
38+
39+
TreeNode node = new TreeNode(root);
40+
node.left = left;
41+
node.right = right;
42+
return node;
43+
}
44+
45+
private int getMaxIndex(int[] nums, int start, int end, int max) {
46+
int index = 0;
47+
for (int i = start; i <= end; i++) {
48+
if (nums[i] == max) {
49+
max = nums[i];
50+
index = i;
51+
break;
52+
}
53+
}
54+
return index;
55+
}
56+
}
57+
// @lc code=end

Diff for: 114.二叉树展开为链表.java

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* @lc app=leetcode.cn id=114 lang=java
3+
*
4+
* [114] 二叉树展开为链表
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* Definition for a binary tree node.
10+
* public class TreeNode {
11+
* int val;
12+
* TreeNode left;
13+
* TreeNode right;
14+
* TreeNode() {}
15+
* TreeNode(int val) { this.val = val; }
16+
* TreeNode(int val, TreeNode left, TreeNode right) {
17+
* this.val = val;
18+
* this.left = left;
19+
* this.right = right;
20+
* }
21+
* }
22+
*/
23+
class Solution {
24+
public void flatten(TreeNode root) {
25+
if (root == null)
26+
return;
27+
TreeNode parent = new TreeNode();
28+
traverse(root, parent);
29+
}
30+
31+
private TreeNode traverse(TreeNode root, TreeNode parent) {
32+
if (root == null)
33+
return parent;
34+
parent.right = root;
35+
parent = parent.right;
36+
TreeNode left = parent.left;
37+
TreeNode right = parent.right;
38+
parent.left = null;
39+
parent = traverse(left, parent);
40+
parent = traverse(right, parent);
41+
return parent;
42+
}
43+
}
44+
// @lc code=end
+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* @lc app=leetcode.cn id=116 lang=java
3+
*
4+
* [116] 填充每个节点的下一个右侧节点指针
5+
*/
6+
7+
// @lc code=start
8+
/*
9+
// Definition for a Node.
10+
class Node {
11+
public int val;
12+
public Node left;
13+
public Node right;
14+
public Node next;
15+
16+
public Node() {
17+
}
18+
19+
public Node(int _val) {
20+
val = _val;
21+
}
22+
23+
public Node(int _val, Node _left, Node _right, Node _next) {
24+
val = _val;
25+
left = _left;
26+
right = _right;
27+
next = _next;
28+
}
29+
};
30+
*/
31+
32+
class Solution {
33+
public Node connect(Node root) {
34+
if (root == null) {
35+
return root;
36+
}
37+
connectTwo(root.left, root.right);
38+
return root;
39+
}
40+
41+
private void connectTwo(Node left, Node right) {
42+
if (left == null || right == null) {
43+
return;
44+
}
45+
left.next = right;
46+
connectTwo(left.left, left.right);
47+
connectTwo(left.right, right.left);
48+
connectTwo(right.left, right.right);
49+
}
50+
}
51+
// @lc code=end

Diff for: 654.最大二叉树.java

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* @lc app=leetcode.cn id=654 lang=java
3+
*
4+
* [654] 最大二叉树
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* Definition for a binary tree node.
10+
* public class TreeNode {
11+
* int val;
12+
* TreeNode left;
13+
* TreeNode right;
14+
* TreeNode() {}
15+
* TreeNode(int val) { this.val = val; }
16+
* TreeNode(int val, TreeNode left, TreeNode right) {
17+
* this.val = val;
18+
* this.left = left;
19+
* this.right = right;
20+
* }
21+
* }
22+
*/
23+
class Solution {
24+
public TreeNode constructMaximumBinaryTree(int[] nums) {
25+
return traverse(nums, 0, nums.length - 1);
26+
}
27+
28+
private TreeNode traverse(int[] nums, int start, int end) {
29+
if (end < start)
30+
return null;
31+
// 获取最大值的key、value
32+
int[] values = getMaxKeyVal(nums, start, end);
33+
int max = values[0];
34+
int index = values[1];
35+
// 递归处理左右节点
36+
TreeNode left = traverse(nums, start, index - 1);
37+
TreeNode right = traverse(nums, index + 1, end);
38+
39+
TreeNode node = new TreeNode(max);
40+
node.left = left;
41+
node.right = right;
42+
return node;
43+
}
44+
45+
private int[] getMaxKeyVal(int[] nums, int start, int end) {
46+
int max = Integer.MIN_VALUE;
47+
int index = 0;
48+
for (int i = start; i <= end; i++) {
49+
if (nums[i] > max) {
50+
max = nums[i];
51+
index = i;
52+
}
53+
}
54+
return new int[] { max, index };
55+
}
56+
}
57+
// @lc code=end

Diff for: 889.根据前序和后序遍历构造二叉树.java

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
* @lc app=leetcode.cn id=889 lang=java
3+
*
4+
* [889] 根据前序和后序遍历构造二叉树
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* Definition for a binary tree node.
10+
* public class TreeNode {
11+
* int val;
12+
* TreeNode left;
13+
* TreeNode right;
14+
* TreeNode() {}
15+
* TreeNode(int val) { this.val = val; }
16+
* TreeNode(int val, TreeNode left, TreeNode right) {
17+
* this.val = val;
18+
* this.left = left;
19+
* this.right = right;
20+
* }
21+
* }
22+
*/
23+
class Solution {
24+
public TreeNode constructFromPrePost(int[] preorder, int[] postorder) {
25+
return traverse(preorder, 0, preorder.length - 1, postorder, 0, postorder.length - 1);
26+
}
27+
28+
private TreeNode traverse(int[] preorder, int preStart, int preEnd, int[] postorder, int postStart, int postEnd) {
29+
if (preEnd < preStart || postEnd < postStart)
30+
return null;
31+
if (preEnd == preStart) {
32+
return new TreeNode(preorder[preStart]);
33+
}
34+
35+
int leftRootVal = preorder[preStart + 1];
36+
int index = getMaxIndex(postorder, postStart, postEnd, leftRootVal);
37+
int leftSize = index - postStart + 1;
38+
39+
TreeNode left = traverse(preorder, preStart + 1, preStart + leftSize, postorder, postStart, index);
40+
TreeNode right = traverse(preorder, preStart + leftSize + 1, preEnd, postorder, index + 1, postEnd - 1);
41+
42+
TreeNode node = new TreeNode(preorder[preStart]);
43+
node.left = left;
44+
node.right = right;
45+
return node;
46+
}
47+
48+
private int getMaxIndex(int[] nums, int start, int end, int max) {
49+
int index = 0;
50+
for (int i = start; i <= end; i++) {
51+
if (nums[i] == max) {
52+
max = nums[i];
53+
index = i;
54+
break;
55+
}
56+
}
57+
return index;
58+
}
59+
}
60+
// @lc code=end

Diff for: Node.java

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Node {
2+
public int val;
3+
public Node left;
4+
public Node right;
5+
public Node next;
6+
7+
public Node() {
8+
}
9+
10+
public Node(int _val) {
11+
val = _val;
12+
}
13+
14+
public Node(int _val, Node _left, Node _right, Node _next) {
15+
val = _val;
16+
left = _left;
17+
right = _right;
18+
next = _next;
19+
}
20+
};

0 commit comments

Comments
 (0)