zoukankan      html  css  js  c++  java
  • LeetCode 117. 116 填充每个节点的下一个右侧节点指针 II 非BFS版本

    地址 https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/

    给定一个二叉树
    
    struct Node {
      int val;
      Node *left;
      Node *right;
      Node *next;
    }
    填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
    
    初始状态下,所有 next 指针都被设置为 NULL。
    
    
    进阶:
    你只能使用常量级额外空间。
    使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
     
    示例
    输入:root = [1,2,3,4,5,null,7]
    输出:[1,#,2,3,#,4,5,7,#]
    解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图  所示。

    算法1
    主要考虑树的上下移动与横向链表的移动
    树的移动在函数递归中解决
    横向链表使用一个while(p->next!=NULL) p=p->next;也可以解决

    两者结合就是在递归函数中要传递横向链表。
    考虑到横向链表的头的下一层也可以通过横向链表获取,所以递归传递每一层的横向链表的头

    C++ 代码

    /*
    // 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:
     void dfs(Node* start ,Node* root)
    {
        if (root == NULL) return;
    
        if (start == NULL) start = root;
    
        if ( start != root){
            Node* p = start;
            while (p!= NULL && p->next != NULL) p = p->next;
            p->next = root;
        }
    
        Node* nextStart = NULL;
    
        while (start  != NULL) {
            nextStart = (start->left == NULL ? start->right: start->left);
            if (nextStart == NULL) {
                start = start->next;
            }
            else {
                break;
            }
        }
    
        dfs(nextStart, root->left);
        dfs(nextStart, root->right);
    }
    
    Node* connect(Node* root) {
        dfs(NULL,root);
    
        return root;
    }
    
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    servlet的配置
    getRequestDispatcher()与sendRedirect()的区别
    request.setAttribute()怎么用的?
    <jsp:useBean>元素使用全解
    jsp中使用javabean简单例子
    2-1
    跟我想的一样,已经连续暴跌三天了。
    我的判断很正确
    我靠算个账发现最近打德扑输了好多钱啊,怀疑PokerStars里是不是有好多机器人作弊骗钱呢???
    1-18
  • 原文地址:https://www.cnblogs.com/itdef/p/13746282.html
Copyright © 2011-2022 走看看