【剑指offer系列】 从上往下打印二叉树___23

来源:互联网 发布:淘宝联盟怎么拿返利 编辑:程序博客网 时间:2024/05/17 04:37

  题目描述:
  给定一棵二叉树的根节点,按照从上往下的顺序打印每一个节点,同一层的节点按照从左往右的顺序打印
  
  示例:
  这里写图片描述  
  
  分析:
  遇到这中涉及到二叉树的层次问题的时候,利用队列这种数据结构可以使问题变得非常简单。
  首先将根节点加入队列,然后从队列头部取出根节点。
  如果节点的左右孩子非空,则依次将其加入到队列尾部。
  最终所有节点在队列中的顺序恰好是树的层次遍历的顺序。  
  
  代码:      

void levelPrint(treeNode *root){    if(root==NULL)   return;    queue<treeNode *> q;    q.push(root);    while(!q.empty()){        treeNode *t=q.front();        q.pop();        cout<<t->val<<endl;        if(t->left)   q.push(t->left);        if(t->right)  q.push(t->right);    }   }

  相关问题:
  1、Populating Next Right Pointers in Each Node (leetcode 116 & 117)  
  若二叉树中每个节点除了左右孩子节点指针外,还有一个next指针。
  请完成一个函数,实现将每个节点的next指针指向同一层中的右边一个节点。若右边没有节点,则指向NULL
  
  示例:
  这里写图片描述
  
  分析:
  这一题的做法与上一题基本相同,同样利用队列这一数据结构。不过我们可以在每一层遍历完后向队列中加入一个NULL指针,用于标识这一层的所有节点已经全部遍历完
  
  代码:  

void connect(TreeLinkNode *root) {        if(root==NULL)  return;        queue<TreeLinkNode *> q;        q.push(root);        q.push(NULL);        TreeLinkNode *head=NULL;        while(!q.empty()){            TreeLinkNode *t=q.front();            q.pop();            if(t){                if(t->left)                    q.push(t->left);                if(t->right)                    q.push(t->right);            }else{                if(!q.empty())                    q.push(NULL);   //为每一层的末尾加入一个NULL节点            }            if(head){                head->next=t;     //给每个节点的next指针赋值                head=head->next;            }else{                head=t;            }        }    }
0 0
原创粉丝点击