leetcode--populating_next_right_pointers_in_each_node

33 篇文章 0 订阅
27 篇文章 0 订阅

leetcode–populating_next_right_pointers_in_each_node

题意:给定一个二叉树结构,

public class TreeLinkNode {
    int val;
    TreeLinkNode left, right, next;
    TreeLinkNode(int x) { val = x; }
 }

每一个节点添加一个指针next(如上),指向该节点所在层中右边的节点,如果该节点右边没有其他节点,则将next指向null,开始时所有节点的next指针都是null。

条件: 1.只能常数的空间; 2.假设这是一棵完美二叉数(所有的叶子节点在同一层并且每一个父节点都有两个孩子)。

举例:给定如下的完美二叉树

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

执行后该树应该如下图所示

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

分析:本题第一反应是使用广度优先遍历然后再结合满二叉树的性质(左孩子节点=2×父亲节点)来做。但是本题要求只能使用常数空间复杂度,广度优先遍历需要使用队列,不符合要求。
使用层次遍历,增加一个指针previous,指向已经构造好的当前层,假设已经构造好了第2层,则指向第2层的2节点,现在需要构造第3层:

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

增加一个指针present,指向当前需要构造的层。此时只需要遍历一遍第二层,在遍历到2时,将4节点的next设置为5,present指针指向5节点,previous节点向后移一个,此时previous指向3节点,它的左右孩子节点为6、7。将5节点的next设置为6节点,present指针向后移一位指向6节点,再将6节点的next设置为7节点,present指针再向后移一位指向7节点。由于初始所有节点的next指针均为NULL,所以第3层到这里就构造完毕。如果后面还有其他层的话,只需要将previous指针指向第3层的4节点,present指针指向第4层,以此类推执行即可。

代码

public void connect(TreeLinkNode root) {
        if(root == null){
            return;
        }else{
            TreeLinkNode previous = root; 
            TreeLinkNode present = null;
            TreeLinkNode head = null;
            while(previous.left != null){
                while(previous != null){
                    if(present == null){
                        present = previous.left;
                        present.next = previous.right;
                        head = present;
                        present = present.next;
                        previous = previous.next;
                    }else{
                        present.next = previous.left;
                        present = present.next;
                        present.next = previous.right;
                        present = present.next;
                        previous = previous.next;
                    }
                }
                previous = head;            //previous指向下一层
                present = null;             //present指向下一层
            }
        }
    }

源程序下载

总结:使用该方法不用额外的创建太多空间,只需要创建3个指针即可,而且用上一层构建下一层这种方法也可以实现二叉树的层次遍历(不是满二叉树也可以这么做,不过需要加上判断条件,一般的层次遍历使用两个队列实现)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值