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
梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~