zoukankan      html  css  js  c++  java
  • LeetCode116 每个节点的右向指针

    给定一个二叉树

    struct TreeLinkNode {
      TreeLinkNode *left;
      TreeLinkNode *right;
      TreeLinkNode *next;
    }

    填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

    初始状态下,所有 next 指针都被设置为 NULL

    说明:

    • 你只能使用额外常数空间。
    • 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
    • 你可以假设它是一个完美二叉树(即所有叶子节点都在同一层,每个父节点都有两个子节点)。

    示例:

    给定完美二叉树,

         1
       /  
      2    3
     /   / 
    4  5  6  7

    调用你的函数后,该完美二叉树变为:

         1 -> NULL
       /  
      2 -> 3 -> NULL
     /   / 
    4->5->6->7 -> NULL






    /**
     * Definition for binary tree with next pointer.
     * struct TreeLinkNode {
     *  int val;
     *  TreeLinkNode *left, *right, *next;
     *  TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}
     * };
     */
    /*
    算法思想:
        实际上是树的层序遍历的应用。
        递归的解法,由于是完全二叉树,所以若节点的左子结点存在的话,其右子节点必定存在,所以左子结点的next指针可以直接指向其右子节点,对于其右子节点的处理方法是,判断其父节点的next是否为空,若不为空,则指向其next指针指向的节点的左子结点,若为空则指向NULL。
    */
    //算法实现:
    class Solution {
    public:
        void connect(TreeLinkNode *root) {
            if (!root) 
                return;
            if (root->left) 
                root->left->next = root->right;
            if (root->right) 
                root->right->next = root->next? root->next->left : NULL;
            connect(root->left);
            connect(root->right);
        }
    };
    
    /*
    算法思想:
        实际上是树的层序遍历的应用。
        非递归的解法,需要用到queue来辅助,由于是层序遍历,每层的节点都按顺序加入queue中,而每当从queue中取出一个元素时,将其next指针指向queue中下一个节点即可。需要巧妙的通过给queue中添加空指针NULL来达到分层的目的,使每层的最后一个节点的next可以指向NULL。
    */
    //算法实现:
    class Solution {
    public:
        void connect(TreeLinkNode *root) {
            if (!root) return;
            queue<TreeLinkNode*> q;
            q.push(root);
            q.push(NULL);
            while (true) {
                TreeLinkNode *cur = q.front();
                q.pop();
                if (cur) {
                    cur->next = q.front();
                    if (cur->left) 
                        q.push(cur->left);
                    if (cur->right) 
                        q.push(cur->right);
                } 
                else {
                    if (q.size() == 0 || q.front() == NULL) 
                        return;
                    q.push(NULL);
                }
            }
        }
    };
    
    /*
    算法思想:
        实际上是树的层序遍历的应用。
        题目中要求用O(1)的空间复杂度,所以我们来看下面这种碉堡了的方法。用两个指针start和cur,其中start标记每一层的起始节点,cur用来遍历该层的节点,设计思路之巧妙,不得不服啊!
    */
    //算法实现:
    class Solution {
    public:
        void connect(TreeLinkNode *root) {
            if (!root) 
                return;
            TreeLinkNode *start = root, *cur = NULL;
            while (start->left) {
                cur = start;
                while (cur) {
                    cur->left->next = cur->right;
                    if (cur->next) 
                        cur->right->next = cur->next->left;
                    cur = cur->next;
                }
                start = start->left;
            }
        }
    };
  • 相关阅读:
    做汉堡
    第三次作业:五章感想与问题
    第二次作业:结对练习
    自己要的东西
    存在不知道是什么问题的程序
    第一个Sprint冲刺第二天
    第一个Sprint冲刺第一天
    第三个Sprint完结工作 用场景来规划测试工作.
    beta 阶段的 postmortem 报告
    重新评估团队贡献分
  • 原文地址:https://www.cnblogs.com/parzulpan/p/10060257.html
Copyright © 2011-2022 走看看