问题分类
1.自顶向下:从一个节点向下寻找路径,到某个节点结束
2.非自顶向下:任意节点到任意节点路径
结题模板
DFS,BFS
1.自顶向下DFS
一般路径:
def dfs(TreeNode*root,path)
{
if not root:
return; //根节点为空直接返回
path.append(root->val); //将该节点值输入路径列表中
if not root.left and not root.right //如果到叶节点
{
return path
}
dfs(root->left,path); //继续递归
dfs(root->right,path);
}
# **给定和的路径:**
def dfs(TreeNode*root, int sum, path)
{
if not root :#空树
return;
sum -= root->val;#将此值在总和中减去
path.append(root->val);
if not root.left and not root.right and sum == 0 #非叶子节点并且完成和
{
return path;
}
dfs(root->left, sum, path);
dfs(root->right, sum, path);
}
注意点:
1.有给定和时,可用给定值减去节点值判断是否退出递归
2.多数不需要回溯
3.是否return路径:看题目要求
4.是否从根节点开始
2.非自顶向下
这类题目一般解题思路如下:
设计一个辅助函数maxpath,调用自身求出以一个节点为根节点的左侧最长路径left和右侧最长路径right,那么经过该节点的最长路径就是left+right
1.确定节点值是否有负值
2.两点之间路径为1
int res=0;
int maxPath(TreeNode *root) //以root为路径起始点的最长路径
{
if (!root)
return 0;
int left=maxPath(root->left);
int right=maxPath(root->right);
res = max(res, left + right + root->val); //更新全局变量
return max(left, right); //返回左右路径较长者
}