问题描述:
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}
,
3 / \ 9 20 / \ 15 7
return its bottom-up level order traversal as:
[ [15,7], [9,20], [3] ]
思考:
利用宽度优先搜索思想,把每一层的所有节点作为一个链表,然后把每一层(作为元素)又合并为一个新的复合链表,最后使用简单的反向操作,把复合链表反向即可。
代码(java):
public class BinaryTreeLevelOrderTraversal_II {
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public List<List<Integer>> levelOrderBottom(TreeNode root) {
if(root == null){
return new ArrayList<List<Integer>>();
}
List<List<Integer>> totalValueList = new ArrayList<List<Integer>>();
List<TreeNode> thisFloor = new ArrayList<TreeNode>();
//从根节点开始遍历
thisFloor.add(root);
//遍历当前层,儿子那一层添加到下一层集合
while(thisFloor.isEmpty() == false){
List<Integer> valueList = new ArrayList<Integer>();
List<TreeNode> nextFloor = new ArrayList<TreeNode>();
//对这一层每一个节点的遍历
for(int i = 0 ; i < thisFloor.size() ; i++ ){
TreeNode node = thisFloor.get(i);
valueList.add(node.val);
if(node.left != null){nextFloor.add(node.left);}
if(node.right != null){nextFloor.add(node.right);}
}
totalValueList.add(valueList);
thisFloor = nextFloor;
}
int start = 0;
int end = totalValueList.size()-1;
while(start < end){
List<Integer> temp = totalValueList.get(start);
totalValueList.set(start, totalValueList.get(end));
totalValueList.set(end, temp);
start++;
end--;
}
return totalValueList;
}
}