LeetCode 116. 填充每个节点的下一个右侧节点指针

  • 题目:
    给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {
int val;
Node *left;
Node *right;
Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

初始状态下,所有 next 指针都被设置为 NULL。

在这里插入图片描述
在这里插入图片描述

  • 解题思路
    1.递归法
    递归出口:
    如果节点为空,则直接返回
    若果节点左右节点存在,则节点的左孩子指向节点的右孩子;若节点的next节点不为空,则节点的right指向next的left

一般情况:递归左子树,递归右子树

代码实现:

Node* connect(Node* root) {
        if(!root)
            return root;
        if(root->left && root->right) {
            root->left->next = root->right;
            if(root->next){
                root->right->next = root->next->left;
            } 
         }
        connect(root->left);
        connect(root->right);
        return root;
    }

方法二:迭代法

Node* connect(Node* root) {
        if(!root) return root;
        Node* left_node = root->left;                         //始终记录下一个最左边节点的位置
        Node* cur = root;                                               //工作指针
        while(cur->left && cur->right) {
                cur->left->next = cur->right;                         //左右孩子节点存在时,左孩子指向右孩子
                if(cur->next) {                                                //next节点存在时,右孩子指向next的左孩子
                    cur->right->next = cur->next->left;
                    cur = cur->next;
                } else {                                                                   //next为空时,更新cur为最左边的节点
                    cur = left_node;
                    left_node = left_node->left;
                }  
        }
        return root;
    }

猜你喜欢

转载自blog.csdn.net/xiao1guaishou/article/details/88336577
今日推荐