给每一个结点添加向右的next指针结点


版权声明:本文为博主原创文章,转载请注明出处。
个人博客地址:https://yangyuanlin.club
欢迎来踩~~~~


  • 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 toNULL.

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指针结点,指针指向右边的下一个结点。如果没有下一个右边结点,next指针应该被设置为指向NULL

    提示:(1)只能使用固定的额外空间;(2)假设二叉树都是完美的二叉树(即,所有的叶子都在同一层上,而且每个父结点都有两个孩子结点)。

    就像例子中给出的就是完美二叉树。

    在调用完成的函数后,二叉树的结构变成了上面那样。

  • 思路:仔细考虑题目要求,发现是在同一层上进行操作,应该想到用层次法对二叉树进行操作,思路如下,判断当前节点如果不是叶子结点,说明他有两个孩子结点,将左孩子结点指向右孩子结点,再判断该结点有没有next结点,如果有,那他也有两个孩子结点,就可以把当前结点的右孩子结点指向next结点的左孩子结点,然后再判断next结点的情况,判断完这一层的,再去判断下一层。

    当然还有递归的思想就比较简单了。

  • 代码:(递归)

// 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 == NULL) return; //当前节点存在
        // 当前结点不是叶子结点,那必然就有两个结点,就让左孩子结点的next指向右孩子结点
        if(root->left!=NULL&&root->right!=NULL)
            root->left->next=root->right;
        // 当前结点不是叶子结点,且有next结点
        if(root->right!=NULL&&root->next!=NULL)
            root->right->next=root->next->left;
        connect(root->left); // 递归判断左子树的情况
        connect(root->right); // 递归判断右子树的情况
    }
};

(非递归)

// 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) {
        TreeLinkNode *r = root;
        while(r && r->left){ // 结点非空,且存在孩子结点(左右结点判断一个就好,一个有就都有)
            TreeLinkNode *cur = r;
            while(cur && cur->left){ // 结点非空,且存在孩子结点(左右结点判断一个就好,一个有就都有)
                // 让当前结点的左孩子结点的next指向当前结点的右孩子结点
                cur->left->next = cur->right;
                // 如果当前结点有next结点,
                // 就让当前结点的右孩子结点的next指向当前结点的next结点的左孩子结点
                // (当前结点有孩子结点,说明当前节点的next结点也必有孩子结点)
                cur->right->next = cur->next == NULL ? NULL : cur->next->left;
                // 层序向右
                cur = cur->next;
            }//while
            // 层序向下
            r = r->left;
        }//while
    }
};
  • 以上。

版权声明:本文为博主原创文章,转载请注明出处。
个人博客地址:https://yangyuanlin.club
欢迎来踩~~~~


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 题量有点多,建议Ctrl + F题号或题目哦~ 二叉树的遍历(前序遍历,中序遍历,后序遍历)[144] Binar...
    野狗子嗷嗷嗷阅读 13,002评论 2 37
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,358评论 0 33
  • 编译环境:python v3.5.0, mac osx 10.11.4 前述内容: 线性表 队列 堆栈 线性结构...
    掷骰子的求阅读 7,417评论 1 7
  • 年味正浓,春水初生,迎来了新的一学期。坐在教室里的孩子们可真是身在曹营心在汉,显得非常浮躁。开学第一天的晚自习,我...
    龙语阅读 2,701评论 0 0
  • 我该看什么?视觉已经迷茫……!听觉也还模糊!身体的欲望直线的上升~~~!压制的力量总是很窘迫!……!
    雅典之魂阅读 1,468评论 0 0

友情链接更多精彩内容