博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 116 Populating Next Right Pointers in Each Node 解题报告
阅读量:2173 次
发布时间:2019-05-01

本文共 2605 字,大约阅读时间需要 8 分钟。

Populating Next Right Pointers in Each Node

Total Accepted: 44163 Total Submissions: 122231

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.You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).

For 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

/*

*本题是将一颗完美二叉树每一层用一个next指针连接起来,并且最右侧的节点指向NULL。我的思路是,先用循环把右侧的所有next指针设为NULL,然后使用两个指针,一个表示当前节点,另一个表示指向当前节点的前一个节点
然后按层,一层一层的把next指针都填充完毕。
一开始prev指向1,cur指向2。我们填充next指针的代码放入一个循环中,分为3种情况判断
1:当cur指针是prev的左孩子时,这个时候只需将cur->next 指向prev->right即可。然后使用cur=cur->next把cur指针移向下一个节点。
2:当cur指针是右孩子,而且cur->next不为NULL时,这个时候就是cur是prev的右孩子,但是不在最右侧。这种情况只需把cur->next指向prev->next->left就可以了。然后把cur和prev都向next移动,指向下一个节点
3:其他情况也就是cur是最右侧的节点,这时候需要判断cur是否为最后一个节点,如果是的话就退出循环,如果不是,则将cur和prev都指向下一层的第一个节点。
我们使用了cnt表示当前是第几层,每执行到这个判断代码段的时候,我们把cnt自增,表示到下一层去。通过cnt的大小我们就可以通过循环找到下一层的第一个节点
*/

/** * 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) {} * }; */class Solution {public:    void connect(TreeLinkNode *root) {        if(!root)        {            return;        }        TreeLinkNode *cur = root;        TreeLinkNode *prev = root;        int cnt = 0;        while(cur)        {            cur->next = NULL;            cur = cur->right;        }        if(root->left)            cur = root->left;        else            return;        while(true)        {            if(cur == prev->left)            {                cur->next = prev->right;                cur = cur->next;            }            else if(cur == prev->right && prev->next != NULL)            {                cur->next = prev->next->left;                cur = cur->next;                prev = prev->next;            }            else            {                if(cur->left == NULL)                    break;                else                {                    ++cnt;                    prev = root;                    for(int i = 0; i < cnt; ++i)                        prev = prev->left;                    cur = prev->left;                }            }        }    }};

转载地址:http://bjezb.baihongyu.com/

你可能感兴趣的文章
Go语言学习Part4-1:方法和接口
查看>>
Leetcode Go 《精选TOP面试题》20200628 69.x的平方根
查看>>
leetcode 130. Surrounded Regions
查看>>
【托业】【全真题库】TEST2-语法题
查看>>
博客文格式优化
查看>>
【托业】【新托业全真模拟】疑难语法题知识点总结(01~05)
查看>>
【SQL】group by 和order by 的区别。
查看>>
【Python】详解Python多线程Selenium跨浏览器测试
查看>>
Jmeter之参数化
查看>>
Shell 和Python的区别。
查看>>
Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
查看>>
Loadrunner之https协议录制回放报错如何解决?(九)
查看>>
python中xrange和range的异同
查看>>
列表、元组、集合、字典
查看>>
【Python】easygui小甲鱼
查看>>
【Python】关于Python多线程的一篇文章转载
查看>>
【Pyton】【小甲鱼】文件
查看>>
【Pyton】【小甲鱼】永久存储:腌制一缸美味的泡菜
查看>>
【Pyton】【小甲鱼】异常处理:你不可能总是对的
查看>>
APP性能测试工具
查看>>