leetcode:Populating Next Right Pointers in Each Node

Given a binary tree

    struct TreeLinkNode {
      TreeLinkNode *left;
      TreeLinkNode *right;
      TreeLinkNode *next;
    }

Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.

Initially, all next pointers are set to NULL.

Note:

  • You may only use constant extra space.
  • You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).

For example,
Given the following perfect binary tree,

         1
       /  \
      2    3
     / \  / \
    4  5  6  7

After calling your function, the tree should look like:

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

Hide Tags
  Tree Depth-first Search


题目地址:https://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node/

解题思路:

这道题的第一个解法是自己解出来的,还是挺开心的,毕竟还是个难度系数是medium的题呢哈哈^_^

第一种解法:利用二叉树层序遍历的思想,先按层序遍历的顺序把每个节点连起来。然后把每一层的最右的节点的next都指向NULL(因为是满二叉树,所以直接root->right。。。到底就行了)

代码:

/**
 * Definition for binary tree with next pointer.
 * struct TreeLinkNode {
 *  int val;
 *  TreeLinkNode *left, *right, *next;
 *  TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}
 * };
 */
class Solution {
public:
    void connect(TreeLinkNode *root) {
        //可以采用层序遍历的方法把所有结点按层序遍历的顺序连接
        //然后把所有的最右结点的next置为null
        if(root == NULL) return;
        queue<TreeLinkNode *> Q;
        
        Q.push(root);
        while(!Q.empty()){
            TreeLinkNode *cur = Q.front();
            Q.pop();
            
            if(!Q.empty()) cur->next = Q.front();
            if(cur->left) Q.push(cur->left);
            if(cur->right) Q.push(cur->right);
        }
        
        TreeLinkNode *p = root;
        while(p){
            p->next = NULL;
            p = p->right;
        }
    }
};


第二种解法:这种方法参考了别人的答案,因为二叉树层序遍历的解法还是需要一些空间复杂度,而这里题目要求要用常数空间复杂度。所以用递归的解法。

代码:

/**
 * Definition for binary tree with next pointer.
 * struct TreeLinkNode {
 *  int val;
 *  TreeLinkNode *left, *right, *next;
 *  TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}
 * };
 */
class Solution {
public:
    void connect(TreeLinkNode *root) {
        //重新写一个不需要额外空间的解法
        if(root == NULL) return;
        
        //如果左节点非空,将左节点连接到右节点
        if(root->left){
            root->left->next = root->right;
        }
        //如果右节点非空就将右节点的next连接到...结合上图的5,6节点看
        if(root->right && root->next){
            root->right->next = root->next->left;
        }
        
        connect(root->left);
        connect(root->right);
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值