码迷,mamicode.com
首页 > 编程语言 > 详细

【LeetCode-面试算法经典-Java实现】【116-Populating Next Right Pointers in Each Node(二叉树链接右指针)】

时间:2015-08-12 07:51:31      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:二叉树   链接   算法   面试   java   

【116-Populating Next Right Pointers in Each Node(二叉树链接右指针)】


【LeetCode-面试算法经典-Java实现】【所有题目目录索引】

原题

  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

题目大意

  给定一棵二叉树,有一个next指针,将它们的每一层链接起来。只能使用常量额外空间,树是一棵完美二叉树。

解题思路

  将树的每一层节点用next串起来。这样每一层也会形成一个单链表。而每层的链表头,则是,根的左孩子,左孩子,左孩子。利用双循环,外层循环,沿着根的左孩子,一直向下。内层循环,负责将下一层的节点串起来。即,将自己右孩子放到左孩子的next上,而右孩子,则可通过自己的next指针,找到右邻居。

代码实现

树结点类

public class TreeLinkNode {
    TreeLinkNode left;
    TreeLinkNode right;
    TreeLinkNode next;
}

算法实现类

public class Solution {

    public void connect(TreeLinkNode root) {

        TreeLinkNode node;
        // 题中假设了输入的树是一棵完全叉树
        // 第一个循环用来处理整个树
        // root.left != null如果不用,则处理到最后第一个没有左右子树的结点会出错
        while (root != null && root.left != null) {
            // 每个root表示第一个层的第一个结点
            // node记录每一个层的第一个结点
            node = root;

            // 处理每个层
            while (node != null) {
                // 表示连接的是同一个结点的下的两子结点
                node.left.next = node.right;
                // node不是某个层的最后一个结点
                if (node.next != null) {
                    // 将这个结点的右子结点连接到这个结点的同层相邻结点的左子结点上
                    node.right.next = node.next.left;
                }

                // 移动到同层的下一个结点
                node = node.next;
            }

            // 移动到下一层的第一个结点
            root = root.left;
        }

    }
}

评测结果

  点击图片,鼠标不释放,拖动一段位置,释放后在新的窗口中查看完整图片。

技术分享

特别说明

欢迎转载,转载请注明出处【http://blog.csdn.net/derrantcm/article/details/47438089

版权声明:本文为博主原创文章,未经博主允许不得转载。

【LeetCode-面试算法经典-Java实现】【116-Populating Next Right Pointers in Each Node(二叉树链接右指针)】

标签:二叉树   链接   算法   面试   java   

原文地址:http://blog.csdn.net/derrantcm/article/details/47438089

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!