[LeetCode]117.Populating Next Right Pointers in Each Node II

160 篇文章 28 订阅
【题目】

Follow up for problem "Populating Next Right Pointers in Each Node".

What if the given tree could be any binary tree? Would your previous solution still work?

Note:

  • You may only use constant extra space.

For example,
Given the following binary tree,

         1
       /  \
      2    3
     / \    \
    4   5    7

After calling your function, the tree should look like:

         1 -> NULL
       /  \
      2 -> 3 -> NULL
     / \    \
    4-> 5 -> 7 -> NULL

【分析】

【代码】

/*********************************
*   日期:2014-12-24
*   作者:SJF0115
*   题目: 117.Populating Next Right Pointers in Each Node II
*   来源:https://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/
*   结果:AC
*   来源:LeetCode
*   总结:
**********************************/
#include <iostream>
#include <queue>
using namespace std;

struct TreeLinkNode {
    int val;
    TreeLinkNode *left;
    TreeLinkNode *right;
    TreeLinkNode *next;
    TreeLinkNode(int x):val(x),left(NULL),right(NULL),next(NULL){}
};

class Solution {
public:
    void connect(TreeLinkNode *root) {
        if(root == NULL){
            return;
        }//if
        queue<TreeLinkNode*> cur;
        queue<TreeLinkNode*> next;
        cur.push(root);
        TreeLinkNode *p,*pre;
        while(!cur.empty()){
            pre = NULL;
            // 当前层遍历
            while(!cur.empty()){
                // 出队列
                p = cur.front();
                cur.pop();
                // 横向连接
                if(pre != NULL){
                    pre->next = p;
                }//if
                pre = p;
                // next保存下一层节点
                // 左子树不空加入队列
                if(p->left){
                    next.push(p->left);
                }//if
                // 右子树不空加入队列
                if(p->right){
                    next.push(p->right);
                }//if
            }//while
            p->next = NULL;
            swap(next,cur);
        }//while
    }
};

//按先序序列创建二叉树
int CreateBTree(TreeLinkNode*& T){
    int data;
    //按先序次序输入二叉树中结点的值,-1表示空树
    cin>>data;
    if(data == -1){
        T = NULL;
    }
    else{
        T = new TreeLinkNode(data);
        //构造左子树
        CreateBTree(T->left);
        //构造右子树
        CreateBTree(T->right);
    }
    return 0;
}
// 输出
void LevelOrder(TreeLinkNode *root){
    if(root == NULL){
        return;
    }//if
    TreeLinkNode *p = root,*q;
    while(p){
        q = p;
        // 横向输出
        while(q){
            cout<<q->val<<"->";
            q = q->next;
        }//while
        if(q == NULL){
            cout<<"NULL"<<endl;
        }//if
        p = p->left;
    }//while
}

int main() {
    Solution solution;
    TreeLinkNode* root(0);
    CreateBTree(root);
    solution.connect(root);
    LevelOrder(root);
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@SmartSi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值