Populating Next Right Pointers in Each Node

本文介绍两种填充二叉树中每个节点的next指针的方法,使其指向各自右侧的相邻节点。第一种方法利用分层遍历,第二种方法不使用额外的数据结构,直接通过节点之间的next指针进行连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:假设二叉树节点的数据结构如下:
 struct TreeLinkNode {
      TreeLinkNode *left;
      TreeLinkNode *right;
      TreeLinkNode *next;
    }
填充next指针为该节点的下一个右节点,初始值为NULL。
如,二叉树为
         1
       /  \
      2    3
     / \  / \
    4  5  6  7
填充之后为
         1 -> NULL
       /  \
      2 -> 3 -> NULL
     / \  / \
    4->5->6->7 -> NULL
思路:分层遍历二叉树,用一个向量记录一层的节点,然后将前面节点的next指针指向后面节点。这里使用数组实现队列,从根节点出发,依次将节点从左到右压入一个数组,并用一个游标cur记录当前访问的节点,另一个游标last指示当前层次的最后一个节点的下一个位置,以cur==last作为当前层次访问结束的条件,在访问某一层的同时将该层的所有节点的子节点压入数组,在访问完某一层之后,检查是否还有新层次可以访问,直到访问完所有的层次。
代码:
    void connect(TreeLinkNode *root) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
       if (NULL==root)
          return;
       vector<TreeLinkNode*> vec;
       
       vec.push_back(root);
       int cur=0;
       int last=1;
       while (cur<vec.size())
       {
           last=vec.size();
           
           vector<TreeLinkNode*> row;
           
           while(cur<last)
           {
               row.push_back(vec[cur]);
               if (vec[cur]->left)
                  vec.push_back(vec[cur]->left);
               if (vec[cur]->right)
                  vec.push_back(vec[cur]->right);
               cur++;
           }
           row.push_back(NULL);
           for (int i=0;i<row.size()-1;i++)
               row[i]->next=row[i+1];
       }
    }
思路二:不用任何辅助结构。如果当前节点有左右子节点,先把他们链接起来,因为肯定是相邻的。

然后通过root的next指针,找到需要与当前节点子节点连接的后继节点。

因为涉及到root的next指针查询,递归需要先处理完右子树,以便左子树节点next指针的连接。

void connect(TreeLinkNode *root) {
       if(!root)return;
            TreeLinkNode *temp=root->next,*p;
            if(root->left &&root->right)
            {
                p=root->right;
                root->left->next = root->right;
            }
            else if(root->right)p=root->right;
            else if(root->left)p=root->left;
            else p=NULL;
            if(p)
            {
                while(temp)
                {
                    if(temp->left)
                    {
                        p->next = temp->left;
                        break;
                    }
                    else if(temp->right)
                    {
                        p->next = temp->right;
                        break;
                    }
                    else temp=temp->next;
                }
            }
            connect(root->right);
            connect(root->left);
            
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值