leetcode-107-Binary-Tree-Level-Order-Traversal-II

描述


Given a binary tree, return the bottom-up level order traversal of its nodes’ values. (ie, from left to right, level by level from leaf to root).

For example:
Given binary tree {3,9,20,#,#,15,7},

1
2
3
4
5
  3
/ \
9 20
/ \
15 7

return its bottom-up level order traversal as:

1
2
3
4
5
[
[15,7],
[9,20],
[3]
]

分析


树的层次遍历,与(E) Binary Tree Level Order Traversal代码基本一样,但最后返回的是vector>(result.rbegin(), result.rend()),因为传入的是rbegin和rend,可以将序列翻转:
rbeginrend

解决方案1(Python)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None

class Solution(object):
def levelOrderBottom(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if not root:
return []
result = []
next_level = [root]

while next_level:
now_level = next_level
result.insert(0, map(lambda x: x.val, now_level))

next_level = []
for item in now_level:
if item.left:
next_level.append(item.left)
if item.right:
next_level.append(item.right)
return result

解决方案2(C++)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> result;

void leveltravel(TreeNode* root, int level) {
if(root == NULL) {
return;
}
if(level == result.size()) {
vector<int> v;
result.push_back(v);
}
result[level].push_back(root->val);
leveltravel(root->left, level+1);
leveltravel(root->right, level+1);
}

vector<vector<int>> levelOrderBottom(TreeNode* root) {
leveltravel(root, 0);
return vector<vector<int>>(result.rbegin(), result.rend());
}
};

解决方案3(Java)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> result = new LinkedList<List<Integer>>();
DFS(root, 0, result);
return result;
}

private void DFS(TreeNode node, int i, List<List<Integer>> result) {
if (node == null) {
return;
}

if (i == result.size()) {
result.add(0, new LinkedList<Integer>());
}
result.get(result.size()-i-1).add(node.val);
DFS(node.left, i+1, result);
DFS(node.right, i+1, result);
}
}

解决方案4 (Golang)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func levelOrderBottom(root *TreeNode) [][]int {
if root == nil {
return nil
}
result := [][]int{}
queue := []*TreeNode{root}
for len(queue) > 0 {
queueLength := len(queue)
layer := []int{}
for i := 0; i < queueLength; i++ {
layer = append(layer, queue[i].Val)
if queue[i].Left != nil {
queue = append(queue, queue[i].Left)
}
if queue[i].Right != nil {
queue = append(queue, queue[i].Right)
}
}
result = append(result, layer)
queue = queue[queueLength:]
}
for i, resultLength := 0, len(result); i < resultLength/2; i++ {
result[i], result[resultLength-i-1] = result[resultLength-i-1], result[i]
}
return result
}

相关问题


题目来源