DFS解决

it2024-04-23  12

这题让求的是从根节点到叶子节点的所有路径,最常见的一种方式就是DFS(深度优先搜索),也就是从根节点沿着最左边节点一直走下去(如果没有左子节点,有右子节点,会沿着右子节点走下去),当到达叶子节点的时候在返回到父节点,然后沿着父节点的右子节点开始走下去,如下图所示

 

 

 

在前面讲过二叉树的dfs,373,数据结构-6,树,他的代码如下

public static void treeDFS(TreeNode root) { if (root == null) return; System.out.println(root.val); treeDFS(root.left); treeDFS(root.right); }

他就是从根节点到叶子节点的所有路径都会访问一遍,我们只需要把这个路径串联起来即可,这里来仿照上面的代码改造一下

public List<String> binaryTreePaths(TreeNode root) { List<String> res = new ArrayList<>(); if (root == null) return res; dfs(root, "", res); return res; } private void dfs(TreeNode root, String path, List<String> res) { //如果到达叶子节点,就把结果存放到集合res中 if (root.left == null && root.right == null) res.add(path + root.val); //如果左子节点不为空,就沿着左子节点走下去 if (root.left != null) dfs(root.left, path + root.val + "->", res); //如果右子节点不为空,就沿着右子节点走下去 if (root.right != null) dfs(root.right, path + root.val + "->", res); }

在第373题讲到二叉树DFS遍历的时候,还有一种非递归的写法,代码如下

public static void treeDFS(TreeNode root) { Stack<TreeNode> stack = new Stack<>(); stack.add(root); while (!stack.empty()) { TreeNode node = stack.pop(); System.out.println(node.val); if (node.right != null) { stack.push(node.right); } if (node.left != null) { stack.push(node.left); } } }

因为他的遍历过程没变,只不过写法改变了,我们也可以来对他进行改造,看下最终代码

public List<String> binaryTreePaths(TreeNode root) { List<String> res = new ArrayList<>(); if (root == null) return res; //存储节点的栈 Stack<TreeNode> stackNode = new Stack<>(); //存储路径的栈,和上面的栈是同步进行的,这里路径指的是 //从根节点到当前节点的路径 Stack<String> stackPath = new Stack<>(); //根节点和根节点的路径同时入栈 stackNode.push(root); stackPath.push(root.val + ""); while (!stackNode.empty()) { //当前节点和对应的路径同时出栈 TreeNode node = stackNode.pop(); String path = stackPath.pop(); //如果到达叶子节点,就把路径加入到集合res中 if (node.left == null && node.right == null) { res.add(path); } //如果右子节不为空,就把右子节点和对应的路径分别加入到栈中 if (node.right != null) { stackPath.push(path + "->" + node.right.val); stackNode.push(node.right); } //同上 if (node.left != null) { stackPath.push(path + "->" + node.left.val); stackNode.push(node.left); } } return res; }
最新回复(0)