【LeetCode & 剑指offer刷题】树题18:Populating Next Right Pointers in Each Node

【LeetCode & 剑指offer刷题】树题18:Populating Next Right Pointers in Each Node

【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)

Populating Next Right Pointers in Each Node

Given a binary tree
struct TreeLinkNode {
TreeLinkNode *left;
TreeLinkNode *right;
TreeLinkNode *next;
}
Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to   NULL .
Initially, all next pointers are set to   NULL .
Note:
  • You may only use constant extra space.
  • Recursive approach is fine, implicit stack space does not count as extra space for this problem.
  • You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).
Example:
Given the following perfect binary tree,
     1
    /  \
   2    3
  / \   / \
  4 5   6 7
After calling your function, the tree should look like:
1 -> NULL
/ \
2 -> 3 -> NULL
/ \ / \
4->5->6->7 -> NULL

C++
 
/**
 * 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) {}
 * };
 */
/*
方法一:递归法
Recursion, more than constant space
*/
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 : nullptr ; // 连接右结点与根结点右边结点的左结点
       
        // 对左右子树递归连接
        connect ( root -> left );
        connect ( root -> right );
    }
};
/* 掌握
方法二:迭代法
常数空间
*/
class Solution
{
public :
    void connect ( TreeLinkNode * root )
    {
        if (! root ) return ;
       
        //start 标记每一层的起始节点, cur 用来遍历该层的节点
        TreeLinkNode * start = root , * cur = nullptr ;
        while ( start -> left ) // 需要对下层处理,故要判断 start->left
        {
            cur = start ;
            while ( cur ) // 每次连接下一层的 next 指针
            {
                // 对根结点的左右子结点进行连接
                if ( cur -> left )
                    cur -> left -> next = cur -> right ; //连接左结点和右结点
                if ( cur -> right )
                    cur -> right -> next = cur -> next ? cur -> next -> left : nullptr ; //连接右结点与根结点右边结点的左结点
               
                cur = cur -> next ; // 该层的 next 指针已经由上一次的迭代处理好
            }
            start = start -> left ; // 下一层的起始结点
        }
    }
};
 
 
 
 
//方法三:利用level-order中的递归遍历思想,功能实现了,但是用到了cache,空间复杂度为O(num of levels),不符合题目常数空间的要求(该方法不好!!)
class Solution
{
public :
    void connect ( TreeLinkNode * root )
    {
        vector < TreeLinkNode *> cache ; //用于存储每层上一节点的指针
        traverse ( root , 1 , cache );
    }
   
    void traverse ( TreeLinkNode * root , int level , vector < TreeLinkNode *>& cache )
    {
       
        if ( root == nullptr ) return ; //递归的出口
       
        if ( cache . size () < level ) cache . push_back ( nullptr ); //初始时存空指针
       
        root -> next = cache [ level - 1 ];
        cache [ level - 1 ] = root ;
        traverse ( root -> right , level + 1 , cache ); //level-order按每层从右往左遍历
        traverse ( root -> left , level + 1 , cache );
    }
};
 
 

 

posted @ 2019-01-05 19:51 wikiwen 阅读( ...) 评论( ...) 编辑 收藏
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值