Skip to content

Commit f5dd6e0

Browse files
author
yangjunbao
committed
打印右侧节点数及最后一个左子树节点
1 parent 9d88ad9 commit f5dd6e0

File tree

3 files changed

+232
-0
lines changed

3 files changed

+232
-0
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package com.apptao.leetcode.tree;
2+
3+
import java.util.ArrayDeque;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
import java.util.Queue;
7+
8+
/**
9+
* Created by a on 2017-12-28.
10+
*
11+
* 给出一个二叉树,求出每一层的 数据和 平均数,
12+
* 例如:
13+
* Input:
14+
3
15+
/ \
16+
9 20
17+
/ \
18+
15 7
19+
Output: [3, 14.5, 11]
20+
第一层级 为 3/1=3
21+
第二层级 为 29/2=14.5
22+
第三层级 为 22/2=11
23+
*
24+
*
25+
* 构建TreeNode com.apptao.leetcode.tree.TreeNode;
26+
*/
27+
public class AverageOfLevelsInBinaryTree {
28+
29+
/**
30+
* 统计同一层级的节点。
31+
*/
32+
class LevelNode {
33+
int level;
34+
TreeNode node;
35+
LevelNode(int level, TreeNode node){
36+
this.level = level;
37+
this.node = node;
38+
}
39+
}
40+
41+
public static void main(String[] args) {
42+
43+
AverageOfLevelsInBinaryTree averageOfLevelsInBinaryTree = new AverageOfLevelsInBinaryTree();
44+
TreeNode root = new TreeNode(3);
45+
TreeNode node1 = new TreeNode(9);
46+
TreeNode node2 = new TreeNode(20);
47+
TreeNode node3 = new TreeNode(15);
48+
TreeNode node4 = new TreeNode(7);
49+
root.rightChild = node1;
50+
root.leftChild = node2;
51+
root.rightChild.leftChild = node3;
52+
root.leftChild.rightChild = node4;
53+
54+
55+
List<Double> doubles = averageOfLevelsInBinaryTree.averageOfLevels(root);
56+
57+
System.out.println(doubles.toString());
58+
59+
60+
}
61+
62+
63+
/**
64+
* 主要算法,隊列存取。
65+
* @param root treeNode
66+
* @return
67+
*/
68+
public List<Double> averageOfLevels(TreeNode root) {
69+
Queue<LevelNode> queue = new ArrayDeque<>();
70+
LevelNode node = new LevelNode(0, root);
71+
queue.offer(node);
72+
int curLevel = 0, count = 0;
73+
long sum = 0L;
74+
List<Double> result = new ArrayList<>();
75+
while(!queue.isEmpty()){
76+
LevelNode first = queue.poll();
77+
if(first.level == curLevel){
78+
sum += first.node.val;
79+
count++;
80+
} else{
81+
result.add((double)sum/count);
82+
sum = first.node.val;
83+
count = 1;
84+
curLevel++;
85+
}
86+
if(first.node.leftChild != null){
87+
queue.offer(new LevelNode(curLevel + 1, first.node.leftChild));
88+
} if(first.node.rightChild != null){
89+
queue.offer(new LevelNode(curLevel + 1, first.node.rightChild));
90+
}
91+
}
92+
result.add((double)sum/count);
93+
return result;
94+
}
95+
96+
97+
98+
99+
}
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package com.apptao.leetcode.tree;
2+
3+
import java.util.ArrayList;
4+
import java.util.LinkedList;
5+
import java.util.List;
6+
7+
/**
8+
* Created by a on 2017-12-28.
9+
*
10+
* 给定一个二叉树,假设你站在右侧,打印出你能看到的路径内的节点。
11+
* 右侧节点
12+
* * 1 <---
13+
* / \
14+
* 2 3 <---
15+
* \ \
16+
* 5 4 <---
17+
* /
18+
* 6
19+
* return [1, 3, 4].
20+
*/
21+
public class BinaryTreeRightSideView {
22+
23+
private int maxHeigh = Integer.MIN_VALUE;
24+
List<Integer> list = new ArrayList<>();
25+
26+
27+
public static void main(String[] args) {
28+
29+
BinaryTreeRightSideView averageOfLevelsInBinaryTree = new BinaryTreeRightSideView();
30+
TreeNode root = new TreeNode(1);
31+
TreeNode node1 = new TreeNode(2);
32+
TreeNode node2 = new TreeNode(3);
33+
TreeNode node3 = new TreeNode(4);
34+
TreeNode node4 = new TreeNode(5);
35+
TreeNode node6 = new TreeNode(6);
36+
TreeNode node7 = new TreeNode(7);
37+
root.leftChild = node1;
38+
root.rightChild = node2;
39+
root.leftChild.rightChild = node3;
40+
root.rightChild.rightChild = node4;
41+
root.rightChild.rightChild.leftChild = node6;
42+
// root.rightChild.rightChild.rightChild = node7;
43+
44+
45+
List<Integer> integers = averageOfLevelsInBinaryTree.rightSideView(root);
46+
47+
System.out.println(integers.toString());
48+
49+
List<Integer> integers1 = averageOfLevelsInBinaryTree.rightSideViewWihle(root);
50+
51+
System.out.println(integers1.toString());
52+
53+
54+
}
55+
56+
57+
58+
59+
public List<Integer> rightSideView(TreeNode root) {
60+
if (root == null) return list;
61+
dfs(root, 0);
62+
return list;
63+
}
64+
65+
66+
/**
67+
* 方案一:递归,
68+
*
69+
* @param node
70+
* @param height
71+
*/
72+
private void dfs(TreeNode node, int height) {
73+
if (node != null) {
74+
if (height > maxHeigh) {
75+
list.add(node.val);
76+
maxHeigh = height;
77+
}
78+
dfs(node.rightChild, height + 1);
79+
dfs(node.leftChild, height + 1);
80+
}
81+
}
82+
83+
public List<Integer> rightSideViewWihle(TreeNode root) {
84+
List<Integer> ans = new ArrayList<Integer>();
85+
if (root == null) return ans;
86+
87+
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
88+
queue.add(root);
89+
queue.add(null);
90+
91+
while (!queue.isEmpty()) {
92+
TreeNode node = queue.pollFirst();
93+
94+
if (node == null) {
95+
if (queue.isEmpty()) {
96+
break;
97+
} else {
98+
queue.add(null);
99+
}
100+
} else {
101+
// add the rightest to the answer
102+
if (queue.peek() == null) {
103+
ans.add(node.val);
104+
}
105+
106+
if (node.leftChild != null) {
107+
queue.add(node.leftChild);
108+
}
109+
if (node.rightChild != null) {
110+
queue.add(node.rightChild);
111+
}
112+
}
113+
}
114+
115+
return ans;
116+
}
117+
118+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.apptao.leetcode.tree;
2+
3+
/**
4+
* 构建一个 节点为 int 类型节点
5+
*/
6+
public class TreeNode {
7+
int val;
8+
TreeNode leftChild;
9+
TreeNode rightChild;
10+
11+
TreeNode(int x) {
12+
val = x;
13+
}
14+
15+
}

0 commit comments

Comments
 (0)