您的位置:首页 > 其它

Binary Tree Level Order Traversal II

2014-11-09 14:19 211 查看
这道题A的略烦

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}
,

3
/ \
9  20
/  \
15   7


return its bottom-up level order traversal as:

[
[15,7],
[9,20],
[3]
]


/**
* Definition for binary tree
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/
public class Solution {
int height;
TreeNode root;

public List<List<Integer>> levelOrderBottom(TreeNode root) {
this.height = getDepth(root);//获取树的高度
this.root = root;

List<List<Integer>> list = new ArrayList<List<Integer>>();
for(int i = 0; i < height; i++){
List<Integer> element = new ArrayList<Integer>();
list.add(element);
}//this.height没有错
preOrder(root, list);

return list;
}

/**
* node在tree中高度
* @param root
* @param node
* @return
*/
public int getDepth(TreeNode root, TreeNode node){
if(null == root)
return -Integer.MAX_VALUE;
if(node == root)
return 1;
else{
int maxl = getDepth(root.left, node);
int maxr = getDepth(root.right, node);
if(maxl > maxr)
return maxl + 1;
else
return maxr + 1;
}
}
/**
* 获取树的高度
* @param root
* @return
*/
public int getDepth(TreeNode root){
if(null == root){
return 0;
}else{
int maxl = getDepth(root.left);
int maxr = getDepth(root.right);
return maxl>maxr ? (maxl + 1):(maxr + 1);
}
}
/**
* 前序遍历树
* @param root
*/
public void preOrder(TreeNode root, List<List<Integer>> list){
if(null != root){
int height = getDepth(this.root, root);
List<Integer> element = list.get(this.height - height);
element.add(root.val);
preOrder(root.left, list);
preOrder(root.right, list);
}
}
}


ps:DFS实现

/**
* Definition for binary tree
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/
public class Solution {

public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> container = new ArrayList<List<Integer>>();
if(null == root){
return container;
}
//List<TreeNode> theSameLevel = new ArrayList<TreeNode>();//存放同一层节点
Queue<TreeNode> theSameLevel = new LinkedList<TreeNode>();
theSameLevel.add(root);
while(!theSameLevel.isEmpty()){//theSameLevel不为空
List<Integer> oneLevel = new ArrayList<Integer>();
Queue<TreeNode> temp = new LinkedList<TreeNode>();//暂存同一层的结点
while(!theSameLevel.isEmpty()){
TreeNode cur = theSameLevel.remove();
oneLevel.add(cur.val);
if(null != cur.left)
temp.add(cur.left);
if(null != cur.right)
temp.add(cur.right);
}
theSameLevel = temp;
container.add(0, oneLevel);
}

return container;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: