Skip to content

Commit bff6ed8

Browse files
hua Lhua L
authored andcommitted
week6
1 parent 55247d1 commit bff6ed8

7 files changed

+338
-0
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package com.josh.task6;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import org.junit.Test;
7+
8+
public class BinaryTreeZigzagLevelOrderTraversal {
9+
//初始化二叉树
10+
public TreeNode iniBinaryTree(){
11+
12+
TreeNode node1 = new TreeNode(3);
13+
TreeNode node2 = new TreeNode(9);
14+
TreeNode node3 = new TreeNode(20);
15+
TreeNode node4 = new TreeNode(15);
16+
TreeNode node5 = new TreeNode(7);
17+
node1.left = node2;
18+
node1.right = node3;
19+
20+
node2.left = null;
21+
node2.right = null;
22+
23+
node3.left = node4;
24+
node3.right = node5;
25+
26+
node4.left = null;
27+
node4.right = null;
28+
29+
node5.left = null;
30+
node5.right = null;
31+
32+
return node1;
33+
}
34+
@Test
35+
public void test(){
36+
TreeNode root = iniBinaryTree();
37+
List<List<Integer>> list = new ArrayList<List<Integer>>();
38+
list = zigzagLevelOrder(root);
39+
for(int i=0;i<list.size();i++){
40+
System.out.print("第"+(i+1)+"层元素: ");
41+
for(int j=0;j<list.get(i).size();j++){
42+
System.out.print(list.get(i).get(j)+" ");
43+
}
44+
System.out.println();
45+
}
46+
}
47+
48+
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
49+
List<List<Integer>> list = new ArrayList<List<Integer>>();
50+
int depath = getMaxDepth(root);
51+
for(int i=1;i<depath+1;i++){
52+
List<Integer> levelList = new ArrayList<Integer>();
53+
transLevel(root,i,levelList);
54+
if(i%2 == 0){//反序输出
55+
List<Integer> afterSortList = new ArrayList<Integer>();
56+
for(int k=levelList.size()-1;k>=0;k--){
57+
afterSortList.add(levelList.get(k));
58+
}
59+
list.add(afterSortList);
60+
}else{//顺序输出
61+
list.add(levelList);
62+
}
63+
}
64+
return list;
65+
}
66+
//打印二叉树某一层的节点
67+
public void transLevel(TreeNode root, int level,List<Integer> list){
68+
if(root==null)
69+
return;
70+
else{
71+
if(level == 1){
72+
list.add(root.val);
73+
}else{
74+
transLevel(root.left, level-1,list);
75+
transLevel(root.right, level-1,list);
76+
}
77+
}
78+
}
79+
//得到二叉树最大高度
80+
public int getMaxDepth(TreeNode root) {
81+
if(root == null) return 0;
82+
else{
83+
int left = getMaxDepth(root.left);
84+
int right = getMaxDepth(root.right);
85+
return 1+Math.max(left, right);
86+
}
87+
88+
}
89+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.josh.task6;
2+
3+
import java.util.ArrayDeque;
4+
import java.util.Queue;
5+
6+
import org.junit.Test;
7+
8+
public class ConstructBinaryTreeFromPreorderAndInorderTraversal {
9+
10+
@Test
11+
public void test(){
12+
int[] preorder = {1,2,3,4,5,6,7,8};
13+
int[] inorder = {3,2,5,4,1,7,6,8};
14+
//TreeNode root = getTree(preorder,0,7,inorder,0,7);
15+
TreeNode root = buildTree(preorder, inorder);
16+
//层次遍历构造的二叉查找树树
17+
Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
18+
queue.add(root);
19+
while(!queue.isEmpty()){
20+
TreeNode curNode = queue.remove();
21+
int e = curNode.val;
22+
System.out.print(e+" ");
23+
if(curNode.left != null) queue.add(curNode.left);
24+
if(curNode.right != null) queue.add(curNode.right);
25+
}
26+
}
27+
public TreeNode buildTree(int[] preorder, int[] inorder) {
28+
if(preorder.length==0 || inorder.length==0 || preorder.length!=inorder.length) return null;
29+
if(preorder.length==1) return new TreeNode(preorder[0]);
30+
return getTree(preorder, 0, preorder.length-1, inorder, 0, inorder.length-1);
31+
}
32+
//根据先序和中序构造二叉树
33+
public TreeNode getTree(int[] preorder,int p_s,int p_e, int[] inorder,int i_s,int i_e){
34+
if(i_s<=i_e){
35+
int rootPos = getRootPosFromInorder(inorder, i_s, i_e, preorder[p_s]);
36+
int len = rootPos - i_s;
37+
TreeNode root = new TreeNode(-1);
38+
root.val = inorder[rootPos];
39+
root.left = getTree(preorder, p_s+1, p_s+len, inorder, i_s, rootPos-1);
40+
root.right = getTree(preorder, p_s+len+1, p_e, inorder, rootPos+1, i_e);
41+
return root;
42+
}
43+
return null;
44+
}
45+
//根据先序中的第一个位置,及当前根curRootPos,遍历在中序中的位置,进而将中序分为左右两部分
46+
public int getRootPosFromInorder(int[] inorder,int i_s,int i_e,int curRootPos){
47+
for(int i=i_s;i<=i_e;i++){
48+
if(inorder[i] == curRootPos)
49+
return i;
50+
}
51+
return -1;
52+
}
53+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package com.josh.task6;
2+
3+
import java.util.ArrayDeque;
4+
import java.util.Queue;
5+
import org.junit.Test;
6+
7+
public class ConvertSortedListToBinarySearchTree {
8+
9+
public ListNode iniListNode(){
10+
ListNode head = new ListNode(1);
11+
ListNode listNode2 = new ListNode(2);
12+
ListNode listNode3 = new ListNode(3);
13+
ListNode listNode4 = new ListNode(4);
14+
ListNode listNode5 = new ListNode(5);
15+
ListNode listNode6 = new ListNode(6);
16+
ListNode listNode7 = new ListNode(7);
17+
18+
head.next = listNode2;
19+
listNode2.next = listNode3;
20+
listNode3.next = listNode4;
21+
listNode4.next = listNode5;
22+
listNode5.next = listNode6;
23+
listNode6.next = listNode7;
24+
listNode7.next = null;
25+
26+
return head;
27+
}
28+
@Test
29+
public void test(){
30+
ListNode head = iniListNode();
31+
TreeNode root = sortedListToBST(head);
32+
//层次遍历构造的二叉查找树树
33+
Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
34+
queue.add(root);
35+
while(!queue.isEmpty()){
36+
TreeNode curNode = queue.remove();
37+
int e = curNode.val;
38+
System.out.print(e+" ");
39+
if(curNode.left != null) queue.add(curNode.left);
40+
if(curNode.right != null) queue.add(curNode.right);
41+
}
42+
}
43+
44+
public TreeNode sortedListToBST(ListNode head) {
45+
if(head==null) return null;
46+
if(head.next==null) return new TreeNode(head.val);
47+
int count = 1;
48+
ListNode tempCount = head;
49+
while(tempCount.next != null){//计算ListNode长度
50+
count ++;
51+
tempCount = tempCount.next;
52+
}
53+
int[] num = new int[count];
54+
int i=0;
55+
while(head.next != null){//ListNode转化为num数组
56+
num[i] = head.val;
57+
i++;
58+
head = head.next;
59+
}
60+
num[i] = head.val;
61+
TreeNode root = getMidNode(0, num.length-1, num);//构造二叉搜索树
62+
TreeNode last = new TreeNode(num[num.length-1]);//添加最后一个元素
63+
TreeNode tempNode = root;
64+
while(tempNode.right !=null){
65+
tempNode = tempNode.right;
66+
}
67+
tempNode.right = last;
68+
return root;
69+
}
70+
//递归-根据有序数组构造二叉查找树
71+
public TreeNode getMidNode(int s,int e,int[] num){
72+
TreeNode root = new TreeNode(-1);
73+
if(s<e){
74+
int mid = (s+e)/2;
75+
root.val = num[mid];
76+
root.left = getMidNode(s, mid, num);
77+
root.right = getMidNode(mid+1, e, num);
78+
return root;
79+
}
80+
return null;
81+
}
82+
}

LiangJianhua/task6/ListNode.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.josh.task6;
2+
3+
public class ListNode {
4+
int val;
5+
ListNode next;
6+
ListNode(int x) {
7+
val = x;
8+
}
9+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.josh.task6;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import org.junit.Test;
7+
8+
public class PopulatingNextRightPointersInEachNodeII {
9+
//初始化二叉树
10+
public TreeLinkNode iniTreeLinkNode(){
11+
12+
TreeLinkNode node1 = new TreeLinkNode(3);
13+
TreeLinkNode node2 = new TreeLinkNode(9);
14+
TreeLinkNode node3 = new TreeLinkNode(20);
15+
TreeLinkNode node4 = new TreeLinkNode(15);
16+
TreeLinkNode node5 = new TreeLinkNode(7);
17+
node1.left = node2;
18+
node1.right = node3;
19+
20+
node2.left = null;
21+
node2.right = null;
22+
23+
node3.left = node4;
24+
node3.right = node5;
25+
26+
node4.left = null;
27+
node4.right = null;
28+
29+
node5.left = null;
30+
node5.right = null;
31+
32+
return node1;
33+
}
34+
@Test
35+
public void test(){
36+
TreeLinkNode root = iniTreeLinkNode();
37+
// List<TreeLinkNode> list = new ArrayList<TreeLinkNode>();
38+
// transLevel(root, 2, list);
39+
connect(root);
40+
// for(int i=0;i<list.size();i++){
41+
// System.out.println(list.get(i).val);
42+
// }
43+
}
44+
public void connect(TreeLinkNode root) {
45+
if(root == null) return;
46+
int depath = getMaxDepth(root);
47+
for(int i=1;i<depath+1;i++){
48+
List<TreeLinkNode> list = new ArrayList<TreeLinkNode>();
49+
transLevel(root,i, list);
50+
int count = 0;
51+
while(count<list.size()-1){
52+
list.get(count).next = list.get(count+1);
53+
count++;
54+
}
55+
list.get(count).next = null;
56+
57+
//test
58+
// TreeLinkNode head = list.get(0);
59+
// while(head.next !=null){
60+
// System.out.print(head.val+" ");
61+
// head = head.next;
62+
// }
63+
// System.out.println(head.val+" ");
64+
}
65+
66+
}
67+
//打印二叉树某一层的节点
68+
public void transLevel(TreeLinkNode root, int level,List<TreeLinkNode> list){
69+
if(root==null)
70+
return;
71+
else{
72+
if(level == 1){
73+
list.add(root);
74+
}else{
75+
transLevel(root.left, level-1,list);
76+
transLevel(root.right, level-1,list);
77+
}
78+
}
79+
}
80+
//得到二叉树最大高度
81+
public int getMaxDepth(TreeLinkNode root) {
82+
if(root == null) return 0;
83+
else{
84+
int left = getMaxDepth(root.left);
85+
int right = getMaxDepth(root.right);
86+
return 1+Math.max(left, right);
87+
}
88+
89+
}
90+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.josh.task6;
2+
3+
public class TreeLinkNode {
4+
int val;
5+
TreeLinkNode left, right, next;
6+
TreeLinkNode(int x) { val = x; }
7+
}

LiangJianhua/task6/TreeNode.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.josh.task6;
2+
3+
public class TreeNode {
4+
int val;
5+
TreeNode left;
6+
TreeNode right;
7+
TreeNode(int x) { val = x; }
8+
}

0 commit comments

Comments
 (0)