剑指offer第24题(c#)
剑指offer第24题(c#)
题目描述
输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
这道题花了我一下午=.=(头秃),还是太菜了,得多练练。首先我的解题思路是要利用递归同时递归条件要把握住这两个点:1.路径节点值的和等于输入的整数。2.从根节点到叶节点才算一条完整的路径。
这里我们就可以从这两点切入,要有两部分的判断总和等于输入值和需要从根节点遍历到叶节点判断递归,简言之就是是否到达叶节点和是否等于输入值来决定这个路径是否加入到二维列表中去;
我们采取先序遍历来把整个树走一遍同时依靠上述的两个判断点来记录可行的路径;
下面展示一些 内联代码片
。
public List<List<int>> res1 = new List<List<int>>();
public List<int> res2 = new List<int>();//两个列表用来存储可行路径
public List<List<int>> FindPath(TreeNode root, int expectNumber)
{
// write code here
if(root==null)
return res1;
Path(root,expectNumber);
return res1;
}
public void Path(TreeNode root2,int expectNumber)
{ //将一维列表作为临时路径记录列表,把每一步的值都先加入到res2
res2.Add(root2.val);
if(root2.val==expectNumber&&root2.left==null&&root2.right==null)//如果满足上述说的两个判断点即叶节点和最后值相等则将记录下来的这一条临时路径res2加入到最终记录的二维列表res1中
{
res1.Add(new List<int>(res2));
}
else
{
if(root2.left!=null)//如果还未到达叶节点的话则继续向子节点遍历,同时因为要求取相加相等所以只需要在下一次递归中把输入的和值减去这次遍历中的值即可,进行先序遍历;
Path(root2.left, expectNumber-root2.val);
if(root2.right!=null)
Path(root2.right, expectNumber-root2.val);
}
res2.RemoveAt(res2.Count-1);//这条语句只有在先序遍历走到叶节点才会使用,意思就是不管该叶节点是否对错都要将临时路径返回到上一个节点,去记录其他的路径可能。
}