leetcode_1372.二叉树中的最长交错路径(DFS)

题目

原题链接

给你一棵以 root 为根的二叉树,二叉树中的交错路径定义如下:

  • 选择二叉树中 任意 节点和一个方向(左或者右)。
  • 如果前进方向为右,那么移动到当前节点的的右子节点,否则移动到它的左子节点。
  • 改变前进方向:左变右或者右变左。
  • 重复第二步和第三步,直到你在树中无法继续移动。

交错路径的长度定义为:访问过的节点数目 - 1(单个节点的路径长度为 0 )。

请你返回给定树中最长 交错路径 的长度。
示例1:
leetcode_1372.二叉树中的最长交错路径(DFS)_第1张图片

输入:root = [1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1]
输出:3
解释:蓝色节点为树中最长交错路径(右 -> 左 -> 右)。

思路

首先,题目中的交错路径,我们直接理解为之字形路径即可。

注 :在以下的表述中,一律不考虑 叶子节点节点为空 的情况,代码中将体现

定义一个dfs()函数,这个函数需要三个参数:

  • 当前节点的指针,TreeNode*类型
  • 上一步的方向;或者说,当前节点是父亲节点的左儿子还是右儿子,这个参数至关重要,左儿子用-1表示,右儿子用1表示
  • 更新到了当前节点时,之字形路径的长度

每向儿子节点搜一步,都要面临两种选择:

  • 转变一下方向:这时,函数的 第三个参数——路径的长度 要 +1
  • 不转变方向,如:上一步向左走,这一步继续向左走,因为此时已经不满足之字形路径的定义了,所以,路径的的长度需要变为1,至于为什么是一不是零,接下来会说到。

现在思路已经很清晰了。另,我们还需定义一个全局变量,以存储不断被dfs()函数更新的路径长度最大值,姑且叫它maxn

leetcode_1372.二叉树中的最长交错路径(DFS)_第2张图片

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int maxn = 0; //定义存储最大值的全局变量
    int longestZigZag(TreeNode* root) {
        dfs(root -> left, -1, 1); //向左走是-1
        dfs(root -> right, 1, 1); //向右走是1
            //深度限定为1,就算没有办法走下去(也就是长度为0),下面的dfs函数第一句也就直接返回了
        return maxn;
        
    }
    void dfs(TreeNode* root, int next, int deep) {
    			//看到没?三个参数!
        if(!root) return ; //该节点为空直接返回
        maxn = max(maxn, deep); //更新最大值
        if(next == -1) { //上一步向左走
            dfs(root -> left, -1, 1); //继续向左,归一
            dfs(root -> right, 1, deep + 1); //改变方向,皆大欢喜
        }
        else { //上一步向右走
            dfs(root -> left, -1, deep + 1); //改变方向,皆大欢喜
            dfs(root -> right, 1, 1); //继续向右,归一
        }
    }
};

你可能感兴趣的:(C++_题解,二叉树,leetcode,算法,dfs,c++)