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


    2019-12-27

    11:21:54

    解法1:DFS 递归遍历

    参考:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/solution/c-o1kong-jian-jian-ji-di-gui-by-qqqun902025048/

    解题思路:

    对于任意一次递归,只考虑如何设置子节点的 next 属性,分为三种情况:
    没有子节点:直接返回
    有一个子节点:将这个子节点的 next 属性设置为同层的下一个节点,即为 root.next 的最左边的一个节点,如果 root.next 没有子节点,则考虑 root.next.next,依次类推
    有两个节点:左子节点指向右子节点,然后右子节点同第二种情况的做法
    注意递归的顺序需要从右到左

    /*
    // Definition for a Node.
    class Node {
    public:
        int val;
        Node* left;
        Node* right;
        Node* next;
    
        Node() : val(0), left(NULL), right(NULL), next(NULL) {}
    
        Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}
    
        Node(int _val, Node* _left, Node* _right, Node* _next)
            : val(_val), left(_left), right(_right), next(_next) {}
    };
    */
    class Solution {
    public:
        Node* connect(Node* root) {
            Node* rot = root;
            if(rot != NULL && (rot->left || rot->right)){
                if(rot->left && rot->right){
                    rot->left->next = rot->right;
                }
                Node* node = rot->right ? rot->right : rot->left;
                Node* head = rot->next;
                while(head != nullptr && !(head->left || head->right)){
                    head = head->next;
                }
                node->next = head ? (head->left ? head->left : head->right) : nullptr;
                connect(root->right);//这里一定是右子节点先遍历
                connect(root->left);
            }
            return rot;
        }
    };
  • 相关阅读:
    LeetCode 重排链表算法题解 All In One
    上海图书馆 & 上海图书馆东馆 All In One
    北美 CS 专业 New Grad 工资组成部分 All In One
    Go Gin errors All In One
    人邮学院 All In One
    Leetcode 1512. 好数对的数目
    VS中创建和使用c++的dll动态库(转)
    通过HWND获得CWnd指针/通过CWnd获取HWND
    读文件使用QProgressBar显示进度
    R语言中apply函数的用法
  • 原文地址:https://www.cnblogs.com/JasonPeng1/p/12106374.html
Copyright © 2020-2023  润新知