精华内容
下载资源
问答
  • 二叉树的层次遍历

    2013-12-22 13:47:23
    二叉树的层次遍历
  • 二叉树的层次遍历题目上面的题就是 二叉树的层次遍历 题目的截图,同时 LeetCode 会根据选择的语言给出一个类的定义或者函数的定义,然后在其中实现 二叉树的层次遍历 的解题过程。这次我使用 C++ 语言来进行完成。...

    这次来写一下 LeetCode 的第 102 题,二叉树的层次遍历

    题目描述

    题目直接从 LeetCode 上截图过来,题目如下:

    76cc79aeab1b0e517bf2108ae924d1f9.png

    102.二叉树的层次遍历题目

    上面的题就是 二叉树的层次遍历 题目的截图,同时 LeetCode 会根据选择的语言给出一个类的定义或者函数的定义,然后在其中实现 二叉树的层次遍历 的解题过程。这次我使用 C++ 语言来进行完成。

    C++ 语言给出的函数定义如下:

    /** * 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> levelOrder(TreeNode* root) {            }};

    通过函数定义可以看出,levelOrder 函数的参数是一个二叉树的根节点,然后返回的值是一个二维数组,我们要做的就是按照层次来遍历这个二叉树,并且将二叉树每层的值需要保存在二维数组中并返回。

    问题分析

    该题目是一个比较好理解的题目,因为题目中已经明确了需要使用层次遍历二叉树来得到每个节点上的值,且不同层次上节点的数据保存在不同的数组中,最后每个层次的数组构成一个二维数组。

    拿题目中给出的例子来说明什么是层次遍历,如下图。

    fecf00a14122c870599027c34df23d91.png

    二叉树的层次

    在图中,3 是第一层9 和 20 是第二层15 和 7 是第三层,通过遍历这个二叉树按层次来分别把它们保存到不同的数组中,最后构成一个二维数组返回。

    二叉树的层次遍历需要使用另外一个数据结构来协助进行遍历,另外的那个数据结构就是“队列”。队列的作用是保留每一层的从左到右的顺序,进而使得我们在进行层次遍历的时候,可以按照从左往右的顺序完成层次遍历。

    首先在遍历之前,使根节点先进入队列,队列中有了根节点后,就可以进入循环。进入循环后,首先获取队头的元素,并让队头元素出队,目前也就是根节点,通过出队的元素分别得到它的左孩子和右孩子,并让它的左孩子和右孩子进入临时队列(有可能左孩子和右孩子不同时存在,反正存在哪个哪个进入队列即可)。然后保存当前节点的元素到数组中。然后临时队列中的元素,进入真正要进行循环获取层次的队列,队列中始终要保持只有当前层次的节点。

    由于篇幅有限,可能无法很好的把其方式描述清楚,但是看代码会很直观。

    代码实现

    C++ 的代码如下:

    /** * 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> levelOrder(TreeNode* root) {        vector> vec;        if (root == NULL) {            return vec;        }        // 队列保存树的根节点        queue que;        que.push(root);        while (!que.empty()) {            // 保存当前层上节点的值            vector v;            // 临时队列            queue tmp;            while (!que.empty()) {                TreeNode *p = que.front();                que.pop();                // 左右节点入队                if (p->left) {                    tmp.push(p->left);                }                if (p->right) {                    tmp.push(p->right);                }                v.push_back(p->val);            }            // 下一层的节点入队            while (!tmp.empty()) {                que.push(tmp.front());                tmp.pop();            }            vec.push_back(v);        }        return vec;    }};

    从代码中可以看出,整个代码是一个两层 while 循环,外层的 while 循环用来遍历整棵二叉树,内层 while 循环是用来遍历二叉树相同层的每个节点。代码中,我引入了两个队列,分别是 que 和 tmp,que 队列是用来进行遍历当前层的每个节点的,tmp 队列是用来临时保存当前层的左孩子和右孩子节点的。

    提交结果

    在写完代码后,点击右下角的 “执行代码”,然后观察 “输出” 和 “预期结果” 是否一致,一致的话就点击 “提交” 按钮。点击 “提交” 按钮后,系统会使用更多的测试用例来测试我们写的函数体,如果所有的测试用例都通过了,那么就会给出 “通过” 的字样,如果没有通过,会给出失败的那一组测试用例,我们可以根据给出的测试用例来继续修改代码。我们的代码提交后的截图如下:

    94ebdfdbf9a6f183b700bddb6193e0b5.png

    执行结果

    类似这样需要引入其他数据结构辅助完成的题目,我个人觉得使用 C 语言就比较难,就拿这道题目来说,层次遍历二叉树本身就是两层的 while 循环了,还要引入队列去辅助完成,像 C 语言这样没有现成的集合可以使用,我还要自己去完成一个队列的数据结构去进行管理么?不知道有什么好的方法。

    展开全文
  • 实现二叉树的层次遍历实现二叉树的层次遍历实现二叉树的层次遍历实现二叉树的层次遍历
  • leetcode 第102题 二叉树的层次遍历, 第103题二叉树的锯齿形层次遍历, 第107题 二叉树的层次遍历 II 问题分析 这三道题都考察的都是二叉树的广度优先遍历,二叉树的广度优先遍历非常明显,就是按照顺序输出每一层...

    leetcode 第102题 二叉树的层次遍历, 第103题二叉树的锯齿形层次遍历, 第107题 二叉树的层次遍历 II

    问题分析

    这三道题都考察的都是二叉树的广度优先遍历,二叉树的广度优先遍历非常明显,就是按照顺序输出每一层的节点。这三题都是一个套路,同一种方法只要做一点修改就行了。

    102 题 二叉树的层次遍历

    这一题是为了按照顺序输出给定二叉树的每一层节点的值,其中每一层的值作为一个数组。具体题目见下:
    在这里插入图片描述
    解法是先用一个列表temp保存根节点,然后循环判断temp是否为空。如果不为空,就先将temp中节点的值全部加入到返回数组中。接下来就开始遍历该列表,如果列表的左右节点存在,就加入新生成的子节点列表中,这样遍历后,将子节点列表赋值为temp,接着循环。
    这种解法并没有使用递归,所以要快一点。

    103题 二叉树的锯齿形层次遍历

    该题和102题比较相似,就是从上到下按层输出节点的值,但不同的是每层输出的值顺序不一样。
    在这里插入图片描述
    这一题针对102题的解法只要做一点改动就好了,上题中在加入每一层节点值的时候,要注意加入的顺序,即是顺序加入还是倒序加入。

    107题 二叉树的层次遍历 II

    107题的输出和102题的正好相反,所以直接将102题的结果逆序输出即满足题意。
    在这里插入图片描述
    但是我写了另外一种解法,是使用递归来解题。即先设置数组temp=[root],然后写递归函数来遍历temp,如果temp中的节点由左右儿子,那么加入新的数组。这样遍历结束后,判断儿子节点数组是否包含元素,如果有,那么将儿子数组代入递归函数中,继续递归。如果没有,说明当前数组已经是叶子节点了,那么将数组所有节点的值加入返回数组,并退出当前函数 ,返回上层函数。

    源码

    102 题 二叉树的层次遍历

    class Solution:
        def levelOrder(self, root):
            """
            :type root: TreeNode
            :rtype: List[List[int]]
            """
            ret = []
            if not root:
                return ret
            temp = [root]
            while temp:
                son = []
                ret.append([node.val for node in temp])
                for node in temp:
                    if node.left:
                        son.append(node.left)
                    if node.right:
                        son.append(node.right)
                temp = son
            return ret
    

    103题 二叉树的锯齿形层次遍历

    class Solution:
        def zigzagLevelOrder(self, root):
            """
            :type root: TreeNode
            :rtype: List[List[int]]
            """
            ret = []
            if not root:
                return ret
            flag = True
            nodeList = [root]
            while nodeList:
                temp = []
                if flag:
                    ret.append([node.val for node in nodeList])
                else:
                    ret.append([node.val for node in nodeList[::-1]])
                for node in nodeList:
                    if node.left:
                        temp.append(node.left)
                    if node.right:
                        temp.append(node.right)
                nodeList = temp
                flag = not flag
            return ret
    

    107题 二叉树的层次遍历 II

    class Solution:
        def levelOrderBottom(self, root):
            """
            :type root: TreeNode
            :rtype: List[List[int]]
            """
            ret = []
    
            # 这里使用广度优先遍历并加上头递归(先递归,后操作)
            def bfs(level):
                son = []
                for node in level:
                    if node.left:
                        son.append(node.left)
                    if node.right:
                        son.append(node.right)
                if son:
                    bfs(son)
                ret.append([node.val for node in level])
                return
    
            if root:
                bfs([root])
            return ret
    
    

    靴靴

    在这里插入图片描述

    展开全文
  • 二叉树的层次遍历II107. 二叉树的层次遍历II题目题解给定一个二叉树,返回其节点值自底向上的层次遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树 [3,9,20,null,null,15,7],3/\...
    4ea30dc0317261fc45dd7c92a5c9ab0d.png
    leetcode

    LeetCode算法-107. 二叉树的层次遍历II

    107. 二叉树的层次遍历II

    题目

    题解

    给定一个二叉树,返回其节点值自底向上的层次遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

    例如:给定二叉树 [3,9,20,null,null,15,7],

        3
       / \
      9  20
        /  \
       15   7

    返回其自底向上的层次遍历为:

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

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    Java

    public List> levelOrderBottom(TreeNode root) {
        LinkedList> list = new LinkedList<>();if (root == null) {return list;
        }
        Queue queue = new LinkedList();
        queue.offer(root);while (!queue.isEmpty()) {
            List subList = new ArrayList();int size = queue.size();for (int i = 0; i             TreeNode node = queue.poll();
                subList.add(node.val);if (node.left != null) {
                    queue.offer(node.left);
                }if (node.right != null) {
                    queue.offer(node.right);
                }
            }
            list.addFirst(subList);
        }return list;
    }

    C++

    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        queue que;if (root != NULL) que.push(root);vector<vector<int>> result;while (!que.empty()) {int size = que.size();vector<int> vec;for (int i = 0; i             TreeNode* node = que.front();
                que.pop();
                vec.push_back(node->val);if (node->left) que.push(node->left);if (node->right) que.push(node->right);
            }
            result.push_back(vec);
        }
        reverse(result.begin(), result.end());return result;
    }

    更多干货文章

    博客:www.qiuxuewei.com
    微信公众号:「@开发者成长之路」
    50eb2afa48070cbbbe63ba8c4c5f8621.png

    「一个没有鸡汤只有干货的公众号」


    展开全文
  • leetcode中的:二叉树的层次遍历iiclass Solution: def levelOrderBottom(self, root: TreeNode) -> List[List[int]]: if not root: return None stack1 = [root] stack2 = [] re...

    leetcode中的:二叉树的层次遍历ii

    d2af0f105779896cc7d9c4ca1e3a917e.png
    class Solution:    def levelOrderBottom(self, root: TreeNode) -> List[List[int]]:        if not root:            return None        stack1 = [root]        stack2 = []        ret = []                while stack1 or stack2:            if stack1:                tmpList = []                while stack1:                    tmp = stack1[0]                    tmpList.append(tmp.val)                    if tmp.left:                        stack2.append(tmp.left)                    if tmp.right:                        stack2.append(tmp.right)                    del stack1[0]                ret.insert(0, tmpList)                        if stack2:                tmpList = []                while stack2:                    tmp = stack2[0]                    tmpList.append(tmp.val)                    if tmp.left:                        stack1.append(tmp.left)                    if tmp.right:                        stack1.append(tmp.right)                    del stack2[0]                ret.insert(0, tmpList)                return ret
    展开全文
  • 这次来写一下 LeetCode 的第 107 题,二叉树的层次遍历2。题目描述 题目直接从 LeetCode 上截图过来,题目如下: 这道题同样是二叉树的题目,也同样是二叉树的层次遍历的问题。但是最终的输出是一个二维数组,二维...
  • 二叉树的层次遍历解答Leetcode 107. 二叉树的层次遍历 II解答 Leetcode 102. 二叉树的层次遍历 给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。 例如: 给定二叉树: [3,9,20,null...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,282
精华内容 4,112
关键字:

二叉树的层次遍历