满二叉树结点加next

leetcode:116. Populating Next Right Pointers in Each Node

 

一、问题描述

给定一个二叉树结构
struct TreeLinkNode
{
  TreeLinkNode *left;
  TreeLinkNode *right;
  TreeLinkNode *next;
}

  • 填充每个下一个指针指向其下一个右侧节点。 如果没有下一个节点,则应该将下一个指针设置为NULL。
  • 最初,所有下一个指针都设置为NULL。
  • 可以假设它是一棵满二叉树(即所有叶子都在同一水平上,并且每个父母都有两个孩子)。

【举例】
给定如下满二叉树,
       1
    /     \
   2      3
  /  \    /  \
4   5  6   7
调用函数后,树变成:
          1 -> NULL
      /       \
    2   ->  3 -> NULL
  /   \      /   \
4-> 5->6->7 -> NULL

二、解题思路

三个要点:

 

  • 相同根的左右孩子相连

             1 -> NULL
            /  \

          2 -> 3 -> NULL

root->left  root->right    —  将2->3

 

  • 边界右孩子指向NULL

        root  mark
             1 -> NULL
            /  \

          2    3 -> NULL       —     将3->NULL

 

  • 不同根的右、左孩子相连

                  1 -> NULL
             /         \
(root)   2  ->    3(mark) -> NULL
         /    \      /   \
        4->5-> 6->7 -> NULL     —   将5->6

三、算法实现

/*************************************************
Author:tmw
date:2018-5-9
**************************************************/
#include <stdio.h>
#include <stdlib.h>

typedef struct TreeLinkNode
{
    int val;
    struct TreeNode* left;
    struct TreeNode* right;
    struct TreeNode* next;
}TreeNode;

/**用TreeLinkNode *mark来记录当前结点的下一跳**/
void connect_diy( TreeLinkNode *root, TreeLinkNode *mark )
{
    if( root == NULL ) return;

    /** 1)相同根的左右孩子相连------将2->3 **/
    connect_diy( root->left, root->right );

    root->next = mark;/**将root->next赋给mark**/
    /** 2)边界右孩子指向NULL ------将3->NULL**/
    if( mark == NULL )
        connect_diy( root->right, NULL );
    else
    /** 3)不同根的右、左孩子相连 ----将5->6**/
        connect_diy( root->right, mark->left );
}
void connect(TreeLinkNode *root)
{
    connect_diy(root,NULL);
}

四、执行结果

accpet

 

 

 

梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~

 

    原文作者:满二叉树
    原文地址: https://blog.csdn.net/qiki_tangmingwei/article/details/80260821
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞