DFS以JAVA方式实现例题详解

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实际上属于一种遍历所有节点的算法,因为从一个点到另一个点有多条路径,那么利用栈可以存储那些存在的当时未访问的节点,循环判断栈是否为空,然后出栈即可访问刚才为访问的节点。利用递归比较方便,因为递归也是栈的思想。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值