码迷,mamicode.com
首页 > 其他好文 > 详细

Populating Next Right Pointers in Each Node

时间:2019-11-30 22:43:10      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:定义   code   pre   遍历   队列   层次遍历   顺序存储   递归   pop   

描述:

  填充每一个节点的下一个右侧指针,给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
  struct Node {
    int val;
    Node *left;
    Node *right;
    Node *next;
  }

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


解答:

  看到该问题的描述,从图形上直观的来看,本题和二叉树的层次遍历是相关的。因为填充右侧节点的操作总是在统一层上进

行的。而二叉树的遍历总是分为递归和迭代算法两种,我们也尝试使用两种算法来解决问题。

  首先使用递归的算法,递归算法的核心是找出所有操作的自相似性,因此我们观察对于每个节点的操作。如果当前的节点为空

则不进行任何操作。若当前的节点不为空,若其左子树存在的话,则右子树也是必然存在的,且其next指向其右子树。右子树的next

取值则取决于当前节点的next,若当前节点的next存在,则右子树的next为root->next->left。则按照此分析写出来的递归代码如下:

class Solution {
public:
    //首先为递归的写法,该道题为二叉树的层次遍历的应用
    Node* connect(Node* root) {
        if(!root)  return NULL;
        if(root->left) root->left->next=root->right;
        if(root->right) root->right->next=root->next?root->next->left:NULL;
        connect(root->left);
        connect(root->right);
        return root;
    }
};

  第二种方法是迭代算法,使用队列结构,将每一层的节点按照顺序存储起来,然后将其依次连接起来即可。按照该思路写出的代码如下:

class Solution {
public:
    //使用迭代的方法来层次遍历二叉树的每个节点
    Node* connect(Node* root) {
        if(!root)   return NULL;
        queue<Node*> q;
        q.push(root);
        //每一层遍历前先统计该层的所有节点的个数
        int size=q.size();
        while(!q.empty()){
            size=q.size();
            for(int i=0;i<size;i++){
                Node* t=q.front();q.pop();
                //确保当前的队列当中仍然含有节点
                if(i<size-1)
                    t->next=q.front();
                if(t->left) q.push(t->left);
                if(t->right) q.push(t->right);
            }
        }
        return root;
    }
};

 

Populating Next Right Pointers in Each Node

标签:定义   code   pre   遍历   队列   层次遍历   顺序存储   递归   pop   

原文地址:https://www.cnblogs.com/wangkaia/p/11964299.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!