《leetCode》:Binary Tree Level Order Traversal II

来源:互联网 发布:浙师大行知学院迎新网 编辑:程序博客网 时间:2024/05/21 21:33

题目

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   7return its bottom-up level order traversal as:[  [15,7],  [9,20],  [3]]

思路

思路比较简单,就是利用两个队列将每层结果进行保存,然后保存到最后结果即可

实现代码如下:

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    /*     * 思路:借助于两个队列来完成即可     * */    public List<List<Integer>> levelOrderBottom(TreeNode root) {        //先按层从左到右的获取节点值        Stack<List<Integer>> leverOrderUptoBottomRes=leverOrderBottomHelper(root);        //将leverOrderUptoBottomRes翻转即可        return reversalResult(leverOrderUptoBottomRes);    }    private List<List<Integer>> reversalResult(            Stack<List<Integer>> leverOrderUptoBottomRes) {        List<List<Integer>> temp=new ArrayList<List<Integer>>();        while(!leverOrderUptoBottomRes.isEmpty()){            List<Integer> list=leverOrderUptoBottomRes.pop();            if(!list.isEmpty()){                temp.add(list);            }        }        return temp;    }    private Stack<List<Integer>> leverOrderBottomHelper(TreeNode root) {        Stack<List<Integer>> res=new Stack<List<Integer>>();        if(root==null){            return res;        }        ArrayDeque<TreeNode> q1=new ArrayDeque<TreeNode>();        ArrayDeque<TreeNode> q2=new ArrayDeque<TreeNode>();        //将头结点元素放入q1队列中        q1.add(root);        List<Integer> firstNodeValue=new ArrayList<Integer>();        firstNodeValue.add(root.val);        res.push(firstNodeValue);//先将第一个结点保存在结果中        while(!(q1.isEmpty()&&q2.isEmpty())){            while(!q1.isEmpty()){                TreeNode node=q1.poll();//获取队首元素                if(node.left!=null){                    q2.add(node.left);                }                if(node.right!=null){                    q2.add(node.right);                }            }            List<Integer> leverRes=new ArrayList<Integer>();            while(!q2.isEmpty()){                TreeNode tempNode=q2.poll();                leverRes.add(tempNode.val);                q1.add(tempNode);            }            res.push(leverRes);        }               return res;    }}

总结

在上面的实现过程中,遇到了一些细节的问题,比如说,队列的选取,刚开始选择的是PriorityQueue,然而此队列是将元素从小到大进行保存的队列,因此这不是我需要的。
还有就是:在reversalResult函数中需要对弹出的栈顶元素进行非空判断才会过滤掉那些空结果(即[ ]),如下:

不知道原因是什么。反正完成这个题目出现了很多细节问题。

            if(!list.isEmpty()){                temp.add(list);            }

补充:找到了上面的问题的原因所在,并且由于存在方法来使得List的元素进行翻转,因此就有了如下的代码

/*     * 思路:借助于两个队列来完成即可     * */    public List<List<Integer>> levelOrderBottom(TreeNode root) {        //先按层从左到右的获取节点值        List<List<Integer>> leverOrderUptoBottomRes=leverOrderBottomHelper(root);        //将leverOrderUptoBottomRes翻转即可        Collections.reverse(leverOrderUptoBottomRes);        return leverOrderUptoBottomRes;    }    private List<List<Integer>> leverOrderBottomHelper(TreeNode root) {        List<List<Integer>> res=new Stack<List<Integer>>();        if(root==null){            return res;        }        ArrayDeque<TreeNode> q1=new ArrayDeque<TreeNode>();        ArrayDeque<TreeNode> q2=new ArrayDeque<TreeNode>();        //将头结点元素放入q1队列中        q1.add(root);        List<Integer> firstNodeValue=new ArrayList<Integer>();        firstNodeValue.add(root.val);        res.add(firstNodeValue);//先将第一个结点保存在结果中        while(!(q1.isEmpty()&&q2.isEmpty())){            while(!q1.isEmpty()){                TreeNode node=q1.poll();//获取队首元素                if(node.left!=null){                    q2.add(node.left);                }                if(node.right!=null){                    q2.add(node.right);                }            }            List<Integer> leverRes=new ArrayList<Integer>();            while(!q2.isEmpty()){                TreeNode tempNode=q2.poll();                leverRes.add(tempNode.val);                q1.add(tempNode);            }            //问题再这里,如果leverRes为空,则说明此结果不能被加入最后的结果中去            if(!leverRes.isEmpty()){                res.add(leverRes);            }        }               return res;    }}
1 0
原创粉丝点击