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

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

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;
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值