满二叉树结点加next

本文介绍了一种在二叉树结构中填充每个节点的下一个指针的方法,确保它们指向各自的右侧邻居节点。文章详细阐述了解决方案的三个核心步骤,并提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

 

 

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

 

在 C 语言中设计一个用于回收二叉树内存的函数,通常需要考虑以下几个步骤: 首先,我们需要定义二叉树的数据结构,包含指向前驱和后继节的指针,以及存储数据的变量(假设叫 `data`)。这里是一个简单的示例: ```c typedef struct Node { int data; struct Node* left; struct Node* right; } TreeNode; ``` 然后,为了能够回收节,我们可以在二叉树的上下文中维护一个全局或局部的空闲节链表。当删除一个节时,我们可以将其从当前树中移除,并将其添到这个链表中。 下面是一个简单的例子,展示了如何删除节并释放其内存: ```c // 创建一个新的空节 TreeNode* createNode(int value) { TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode)); if (!newNode) { perror("Memory allocation failed"); return NULL; } newNode->data = value; newNode->left = newNode->right = NULL; return newNode; } // 删除节并释放内存 void deleteNode(TreeNode** node) { if (*node == NULL) { return; } TreeNode* temp = *node; // 如果有左孩子,则将左孩子的最后一个节替换当前节 if (temp->left != NULL) { *node = temp->left->lastInList; (*node)->prev = NULL; } else if (temp->right != NULL) { // 如果只有右孩子 *node = temp->right; } // 移除临时节,将其添到空闲节链表 if (temp->prev != NULL) { temp->prev->next = temp->right; } else { // 如果是根节 root = temp->right; } free(temp); } // 空闲节链表辅助函数,如果节非空则添到链表尾部 void addToFreeList(TreeNode* node) { if (freeListHead == NULL) { freeListHead = node; freeListNode.prev = NULL; } else { freeListNode.next = node; node->prev = freeListNode.prev; freeListNode.prev->next = node; } } // 当不再需要整棵树时,遍历并删除所有节 void destroyBinaryTree(TreeNode* root) { while (root != NULL) { TreeNode* temp = root; root = root->right; deleteNode(&temp); } } ``` 在这个例子中,`lastInList` 是一个指向当前节左子树最后一个节的指针,用于找到节的合适位置插入到空闲链表。`freeListHead` 和 `freeListNode` 分别表示空闲链表的头和当前处理的节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值