LeetCode-116.填充每个节点的下一个右侧节点指针、深度优先搜索

在这里插入图片描述

题目分析

①.广度优先搜索
题目要求把二叉树中每一层的的节点连起来,最简单的方法即 BFS ,按层的顺序的对树进行遍历,但需要使用 queue 数据结构,空间复杂度为 O(N),不符合题目要求。
②.深度优先搜索
由于 next 指针的存在,可以实现对二叉树进行从上往下从左到右的遍历,每个节点的 next 指针在遍历其父节点时进行赋值;当遍历到每一个节点时:把其左子节点和右子节点进行关联、右子节点和其下个节点的左子节点进行关联。

深度优先搜索

深度优先搜索(DFS)就是在每一步时对每一种可能的选择一条道走到底,然后再回过头尝试另外一种选择。
深度优先搜索的关键是要考虑“当前这一步”该如何做,至于“下一步”该怎么做和当前这一步的解决方法是一样的。在进行当前步的选择之前要确定已经做出的选择列表,然后在剩余可供选择的每一种可能进行遍历,对于每一种选择将选择结果以及选择状态代入下一步操作,然后再次进行深度优先搜索。

DFS 实现

DFS的实现考虑要以下几个问题即可:
①.边界范围:即搜索终止条件,递归结束条件。
②.可供选择的范围列表:所有可供选择的范围列表。
③. 已做出的选择列表:标记当前已经做出的选择。
DFS代码模板如下:

void dfs( int cur_step)
{
  //判断边界
  /********/
  //尝试当前可供选择的每种可能
  for(int i = 0;i < maxCount;i++)
  {
    //尝试每种选择
    /******/
    //选择结果代入下一步
    dfs(cur_step+1);
    //撤销当前选择,恢复状态
    /*******/
  }
}

代码示例

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;
    Node() : val(0), left(NULL), right(NULL), next(NULL) {}
    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}
    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/
class Solution {
public:
    Node* connect(Node* root) {
        dfs(root,root);
        return root;  
    }
    void dfs(Node *curLeft,Node *curNode)
    {
        if( curLeft == NULL) return;//当前行为空
        if( curNode == NULL)//当前节点为空
        {
             curLeft = curLeft->left;//转到下一行
             curNode = curLeft;
        }
        if( curNode == NULL ) return;//遍历完了
        //左子节点指向右子节点
        if( curNode->left)
            curNode->left->next = curNode->right;
        //右子节点指向相邻节点左子节点
        if( curNode->left && curNode->next)
            curNode->right->next = curNode->next->left;
        dfs(curLeft,curNode->next);//继续遍历下个节点
    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值