zoukankan      html  css  js  c++  java
  • 二叉树的层序遍历题目汇总

    二叉树的层序遍历,就是图论中的广度优先搜索在二叉树中的应用,需要借助队列来实现(此时是不是又发现队列的应用了)。

    虽然不能一口气打十个,打八个也还行。

    102.二叉树的层序遍历
    107.二叉树的层次遍历II
    199.二叉树的右视图
    637.二叉树的层平均值
    429.N叉树的前序遍历
    515.在每个树行中找最大值
    116.填充每个节点的下一个右侧节点指针
    117.填充每个节点的下一个右侧节点指针II

    作者:carlsun-2
    链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/solution/dai-ma-sui-xiang-lu-wo-yao-da-shi-ge-er-93o1d/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    其中

    116.填充每个节点的下一个右侧节点指针
    117.填充每个节点的下一个右侧节点指针II

    进阶解法需要使用常数空间,进阶解法如下

    116:

    class Solution {
    public:
        void connect(TreeLinkNode *root) {
            if(root==NULL||root->left==NULL)
                return;
            root->left->next=root->right;
            if(root->next!=NULL)
                root->right->next=root->next->left;
            connect(root->left);
            connect(root->right);
            return ;
        }
    };
    

      

    117:

    使用已建立的 ext{next}next 指针
    思路与算法

    因为必须处理树上的所有节点,所以无法降低时间复杂度,但是可以尝试降低空间复杂度。

    在方法一中,因为对树的结构一无所知,所以使用队列保证有序访问同一层的所有节点,并建立它们之间的连接。然而不难发现:一旦在某层的节点之间建立了 ext{next}next 指针,那这层节点实际上形成了一个链表。因此,如果先去建立某一层的 ext{next}next 指针,再去遍历这一层,就无需再使用队列了。

    基于该想法,提出降低空间复杂度的思路:如果第 ii 层节点之间已经建立 ext{next}next 指针,就可以通过 ext{next}next 指针访问该层的所有节点,同时对于每个第 ii 层的节点,我们又可以通过它的 m leftleft 和 m rightright 指针知道其第 i+1i+1 层的孩子节点是什么,所以遍历过程中就能够按顺序为第 i + 1i+1 层节点建立 ext{next}next 指针。

    具体来说:

    从根节点开始。因为第 00 层只有一个节点,不需要处理。可以在上一层为下一层建立 ext{next}next 指针。该方法最重要的一点是:位于第 xx 层时为第 x + 1x+1 层建立 ext{next}next 指针。一旦完成这些连接操作,移至第 x + 1x+1 层为第 x + 2x+2 层建立 ext{next}next 指针。
    当遍历到某层节点时,该层节点的 ext{next}next 指针已经建立。这样就不需要队列从而节省空间。每次只要知道下一层的最左边的节点,就可以从该节点开始,像遍历链表一样遍历该层的所有节点。

    作者:LeetCode-Solution
    链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/solution/tian-chong-mei-ge-jie-dian-de-xia-yi-ge-you-ce-15/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    class Solution {
    public:
        void handle(Node* &last, Node* &p, Node* &nextStart) {
            if (last) {
                last->next = p;
            } 
            if (!nextStart) {
                nextStart = p;
            }
            last = p;
        }
    
        Node* connect(Node* root) {
            if (!root) {
                return nullptr;
            }
            Node *start = root;
            while (start) {
                Node *last = nullptr, *nextStart = nullptr;
                for (Node *p = start; p != nullptr; p = p->next) {
                    if (p->left) {
                        handle(last, p->left, nextStart);
                    }
                    if (p->right) {
                        handle(last, p->right, nextStart);
                    }
                }
                start = nextStart;
            }
            return root;
        }
    };
    
    作者:LeetCode-Solution
    链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/solution/tian-chong-mei-ge-jie-dian-de-xia-yi-ge-you-ce-15/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

      

  • 相关阅读:
    南京网络赛题解 2018
    ACM 第二十天
    存储型XSS漏洞(pikachu)
    XSS跨站脚本(pikachu)——反射型xss(get和post)
    暴力破解(pikachu)——防范措施(简单了解)
    暴力破解02(pikachu)——验证码
    暴力破解01(pikachu)——基于表单
    安全软件burp suite pro破解版(亲测有效)
    sql lab的基础配置和1-4关闯关攻略(建议自学MySQL语言后再观看)
    sql lab的环境配置以及火狐浏览器的使用
  • 原文地址:https://www.cnblogs.com/qiaozhoulin/p/15084976.html
Copyright © 2011-2022 走看看