LeetCode求根到叶子节点数字之和
解题思路
使用DFS深度优先搜索进行遍历,然后遍历时将值进行累加。
递归方式实现DFS
public class TreeNode {//节点定义
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
int res = 0;//全局变量用做存储整个值
public void dfs(TreeNode node,int value) {
if(node==null) return;//若传入节点为空直接返回
value = value*10+node.val;//若节点不为空,将这个节点值进行转换
if(node.left==null&&node.right==null) {//当节点为根节点时说明,某条路遍历到底了,将这个值加入res
res+=value;
return;
}
dfs(node.left,value);//遍历左边的节点
dfs(node.right,value);//遍历右边的节点
}
public int sumNumbers(TreeNode root) {
dfs(root,0);//将根节点与,初始值0传入dfs
return res;
}
非递归方式实现DFS
采用非递归的方式就需要使用栈来进行辅助,将该节点进行入栈操作,
public class TreeNode {//节点定义
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public int sumNumbers(TreeNode root) {
if (root == null)//若节点为空直接返回0
return 0;
int res = 0;//存储整个值
Stack<TreeNode> nodeStack = new Stack<TreeNode>();//存储节点
Stack<Integer> valStack = new Stack<Integer>();//存储节点的值
//初始化将根节点入栈
nodeStack.push(root);
valStack.push(root.val);
//开始遍历,条件为当栈不为空
while(nodeStack.size()!=0) {
//当前节点与值进行出栈
TreeNode node = nodeStack.pop();
int value = valStack.pop();
if(node.left==null&&node.right==null) {//当该节点为叶子节点,说明找到了遍历到底了,将整个过程的值加入res
res += value;
}else {
//若节点不为叶子节点,遍历左节点,然后遍历右节点
if(node.right!=null) {//右节点不为空
nodeStack.push(node.right);
valStack.push(value*10+node.right.val);//这个过程相当于直接将节点的值认作结果(即父节点与子节点已经计算完成的值)
}
if(node.left!=null) {//左节点不为空
nodeStack.push(node.left);
valStack.push(value*10+node.left.val);
}
}
}
return res;
}
心得
DFS实际上属于一种遍历所有节点的算法,因为从一个点到另一个点有多条路径,那么利用栈可以存储那些存在的当时未访问的节点,循环判断栈是否为空,然后出栈即可访问刚才为访问的节点。利用递归比较方便,因为递归也是栈的思想。