513. Find Bottom Left Tree Value (vector & queue)

来源:互联网 发布:美容连锁软件 编辑:程序博客网 时间:2024/06/05 06:37

这道题要求二叉树最下边一层的最左边的节点,是一道比较简单的题。主要当作给Java练习了。


首先是第一个版本:主要思想就是从根节点开始,逐步求下一层的节点,并替换到nodes中。如果发现下一层的节点(用temp来临时存储)是空的,就说明到了最后一层。results来标记每一层最左边的节点,最后就是结果。

import java.util.*;class Solution {    public int findBottomLeftValue(TreeNode root) {    Vector<TreeNode> nodes = new Vector<TreeNode>();    Vector<TreeNode> temp = new Vector<TreeNode>();    TreeNode result = root;    nodes.addElement(root);    while(!nodes.isEmpty()) {    for(TreeNode i : nodes) {    if(i.left != null)temp.addElement(i.left);    if(i.right != null)temp.addElement(i.right);    }    if(!temp.isEmpty())result = temp.elementAt(0);                        nodes.clear();            for(TreeNode i : temp){                nodes.addElement(i);            }                temp.clear();    }    return result.val;    }}

这段代码遇到的坑就是,vector之间的赋值,不可以直接像C++中的一样,比如两个vector a和b。要赋值的话在java中不可以是 a=b。因为这样的话,如果a被清空(clear函数),b也会被清空,所以要逐步的复制。这就额外增加的运行时间。

//这段代码显然很辣鸡,运行很慢,因为两个vector之间的复制需要时间。。

下面是一个稍微好一些的解决方法。这次我们只用一个queue来解决二叉树层次遍历的问题,这样不需要额外的复制,只要保证一层一层的循环就好。主要思想是遍历每一层的节点,同时把子节点添加到队列尾部,需要注意的是每一层遍历时,需要确定这一层有多少个节点,以确定for循环的次数。

import java.util.*;class Solution {    public int findBottomLeftValue(TreeNode root) {     Queue<TreeNode> q = new LinkedList<TreeNode>();     TreeNode result = root;     q.offer(root);     int number = 1;     while(!q.isEmpty()) {     int count = 0;     result = q.peek();     for(int i = 0; i < number; i++) {     TreeNode temp = q.poll();     if(temp.left != null) {     q.offer(temp.left); count++;     }     if(temp.right != null) {     q.offer(temp.right); count++;     }     }     number = count;     }     return result.val;    }}
值得注意的是queue在java中的使用。比如初始化,用到的包有java.util.Queue和java.util.LinkedList。还有添加和删除操作,有add和remove,不过推荐使用offer和poll,这两个可以通过返回值来判断你的操作是否正确完成。


原创粉丝点击