数据结构---二叉树路径问题
创始人
2024-05-06 15:18:47
0

二叉树路径问题

  • 二叉树所有路径
    • 分析
    • JAVA实现
    • 力扣提交
  • 找到一个和为sum的到达叶子节点的路径
    • 分析
    • JAVA实现
    • 力扣提交
  • 求路径(中间一段)
    • C++实现
  • 打印根节点到任意节点的路径
    • JAVA实现

二叉树所有路径

在这里插入图片描述
257二叉树所有路径

分析

前序遍历二叉树+递归实现回溯
深度优先搜索dfs

JAVA实现

//静态内部类//二叉树节点public static class TreeNode{int data;bTree257.TreeNode leftChild;bTree257.TreeNode rightChild;public TreeNode(int data) {this.data = data;}}

二叉树的构建

/*** 前序遍历的链表节点的顺序.来创建二叉树* @param inputList* @return*/public static bTree257.TreeNode precreatBinaryTree(LinkedList inputList){bTree257.TreeNode node = null;if(inputList==null||inputList.isEmpty()){return null;}Integer data = inputList.removeFirst();if(data!=null){//根左右。。。。node = new bTree257.TreeNode(data);node.leftChild=precreatBinaryTree(inputList);node.rightChild = precreatBinaryTree(inputList);}//将根节点返回(用于遍历,不返回根节点,这个树怎么找。。。。。)return node;}

前序遍历代码(写着玩玩)

    /*** 前序遍历* @param node*/public static void preOrderTraveral(bTree257.TreeNode node){if(node==null){return;}System.out.println(node.data);preOrderTraveral(node.leftChild);preOrderTraveral(node.rightChild);}

遍历所有路径:

    public static void dfs(TreeNode root,String path,List ans){if(root!=null){StringBuffer sb = new StringBuffer(path);sb.append(root.data);if(root.leftChild==null&&root.rightChild==null){ans.add(sb.toString());return ;}else {sb.append("->");dfs(root.leftChild,sb.toString(),ans);dfs(root.rightChild,sb.toString(),ans);}return ;}}public List binaryTreePaths(TreeNode root) {List ans = new ArrayList<>();dfs(root,"",ans);return ans;}

递归出口1:if(root.leftChildnull&&root.rightChildnull)
也就是达到这个条件回溯到前面的状态。。。。。
递归出口2:return ;
也就是遍历完成了左右孩子,则回溯到上一个状态

测试方法:

    public static void main(String[] args) {//前序创建二叉树//LinkedList inputList = new LinkedList(Arrays.asList(new Integer[]{1,2,4,null,null,5,null,null,3,null,6}));//LinkedList inputList = new LinkedList(Arrays.asList(new Integer[]{8,5,1,null,null,2,null,null,7}));LinkedList inputList = new LinkedList(Arrays.asList(new Integer[]{}));
//        inputList.add(8);
//        inputList.add(5);
//        inputList.add(1);
//        inputList.add(null);
//        inputList.add(null);
//        inputList.add(2);
//        inputList.add(null);
//        inputList.add(null);
//        inputList.add(7);System.out.println("请按照前序输入二叉树节点:");Scanner in =new Scanner(System.in);int a=0;Scanner sc = new Scanner(System.in);String inputString = sc.nextLine();String stringArray[] = inputString.split(" ");int num[] = new int[stringArray.length];for (int i = 0; i < stringArray.length; i++) {if(Integer.parseInt(stringArray[i])==0){inputList.add(null);}else {inputList.add(Integer.parseInt(stringArray[i]));}}System.out.println("二叉树构建成功!");bTree257.TreeNode treeNode = precreatBinaryTree(inputList);System.out.println("前序遍历如下:");preOrderTraveral(treeNode);System.out.println("遍历所有路径");//1 2 4 0 0 5 0 0 3 0 6//ans存储所有的路径List ans = new ArrayList<>();dfs(treeNode,"",ans);for (int i =0;iSystem.out.println(ans.get(i));}}

前序遍历如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

力扣提交

力扣提交代码:

class Solution {public static void dfs(TreeNode root,String path,List ans){if(root!=null){StringBuffer sb = new StringBuffer(path);sb.append(root.val);if(root.left==null&&root.right==null){ans.add(sb.toString());return ;}else {sb.append("->");dfs(root.left,sb.toString(),ans);dfs(root.right,sb.toString(),ans);}return ;}}public List binaryTreePaths(TreeNode root) {List ans = new ArrayList<>();dfs(root,"",ans);return ans;}
}

在这里插入图片描述
在这里插入图片描述

找到一个和为sum的到达叶子节点的路径

在这里插入图片描述

路径总和

分析

就是在之前的二叉树路径问题上加一点求和代码就行。
将最后的结果(字符串数组,一维度)转为二维数组,遍历求和每一行的值,看其是否等于待求的数。

	    int length = 0;for (int i =0;i//System.out.println(ans.get(i));String str = ans.get(i);String[] strs=str.split("->");System.out.println(Arrays.toString(strs));length = Math.max(length,strs.length);}System.out.println(length);int result[][] = new int[ans.size()][length];for (int i =0;i//System.out.println(ans.get(i));String str = ans.get(i);String[] strs=str.split("->");for (int j =0;jresult[i][j]= Integer.parseInt(strs[j]);}}int total = 8;int sum = 0;for (int i =0;ifor (int  j=0;jsum += result[i][j];}if(sum==total){System.out.println("找到了");}if(i==ans.size()-1&&sum!=total){System.out.println("没找到");}sum=0;}

JAVA实现

package algorithmProblem;import java.util.*;public class bTree112 {//静态内部类//二叉树节点public static class TreeNode{int data;bTree112.TreeNode leftChild;bTree112.TreeNode rightChild;public TreeNode(int data) {this.data = data;}}/*** 前序遍历的链表节点的顺序.来创建二叉树* @param inputList* @return*/public static bTree112.TreeNode precreatBinaryTree(LinkedList inputList){bTree112.TreeNode node = null;if(inputList==null||inputList.isEmpty()){return null;}Integer data = inputList.removeFirst();if(data!=null){//根左右。。。。node = new bTree112.TreeNode(data);node.leftChild=precreatBinaryTree(inputList);node.rightChild = precreatBinaryTree(inputList);}//将根节点返回(用于遍历,不返回根节点,这个树怎么找。。。。。)return node;}/*** 前序遍历* @param node*/public static void preOrderTraveral(bTree112.TreeNode node){if(node==null){return;}System.out.println(node.data);preOrderTraveral(node.leftChild);preOrderTraveral(node.rightChild);}public static void dfs(bTree112.TreeNode root, String path, List ans){if(root!=null){StringBuffer sb = new StringBuffer(path);sb.append(root.data);if(root.leftChild==null&&root.rightChild==null){ans.add(sb.toString());return ;}else {sb.append("->");dfs(root.leftChild,sb.toString(),ans);dfs(root.rightChild,sb.toString(),ans);}return ;}}public ArrayList> binaryTreePaths(bTree112.TreeNode root) {List ans = new ArrayList<>();ArrayList> list = new ArrayList>();LinkedList mylist = new LinkedList();dfs(root,"",ans);return list;}public static boolean hasPathSum(TreeNode root, int targetSum) {System.out.println("遍历所有路径");//1 2 4 0 0 5 0 0 3 0 6//ans存储所有的路径List ans = new ArrayList<>();dfs(root,"",ans);int length = 0;for (int i =0;i//System.out.println(ans.get(i));String str = ans.get(i);String[] strs=str.split("->");System.out.println(Arrays.toString(strs));length = Math.max(length,strs.length);}System.out.println(length);int result[][] = new int[ans.size()][length];for (int i =0;i//System.out.println(ans.get(i));String str = ans.get(i);String[] strs=str.split("->");for (int j =0;jresult[i][j]= Integer.parseInt(strs[j]);}}int total = targetSum;int sum = 0;for (int i =0;ifor (int  j=0;jsum += result[i][j];}if(sum==total){System.out.println("找到了");return true;}if(i==ans.size()-1&&sum!=total){System.out.println("没找到");return false;}sum=0;}return false;}public static void main(String[] args) {//前序创建二叉树//LinkedList inputList = new LinkedList(Arrays.asList(new Integer[]{1,2,4,null,null,5,null,null,3,null,6}));//LinkedList inputList = new LinkedList(Arrays.asList(new Integer[]{8,5,1,null,null,2,null,null,7}));LinkedList inputList = new LinkedList(Arrays.asList(new Integer[]{}));
//        inputList.add(8);
//        inputList.add(5);
//        inputList.add(1);
//        inputList.add(null);
//        inputList.add(null);
//        inputList.add(2);
//        inputList.add(null);
//        inputList.add(null);
//        inputList.add(7);System.out.println("请按照前序输入二叉树节点:");Scanner in =new Scanner(System.in);int a=0;Scanner sc = new Scanner(System.in);String inputString = sc.nextLine();String stringArray[] = inputString.split(" ");int num[] = new int[stringArray.length];for (int i = 0; i < stringArray.length; i++) {if(Integer.parseInt(stringArray[i])==0){inputList.add(null);}else {inputList.add(Integer.parseInt(stringArray[i]));}}System.out.println("二叉树构建成功!");bTree112.TreeNode treeNode = precreatBinaryTree(inputList);System.out.println("前序遍历如下:");preOrderTraveral(treeNode);System.out.println("遍历所有路径");//1 2 4 0 0 5 0 0 3 0 6//ans存储所有的路径List ans = new ArrayList<>();dfs(treeNode,"",ans);int length = 0;for (int i =0;i//System.out.println(ans.get(i));String str = ans.get(i);String[] strs=str.split("->");System.out.println(Arrays.toString(strs));length = Math.max(length,strs.length);}System.out.println(length);int result[][] = new int[ans.size()][length];for (int i =0;i//System.out.println(ans.get(i));String str = ans.get(i);String[] strs=str.split("->");for (int j =0;jresult[i][j]= Integer.parseInt(strs[j]);}}int total = 8;int sum = 0;for (int i =0;ifor (int  j=0;jsum += result[i][j];}if(sum==total){System.out.println("找到了");}if(i==ans.size()-1&&sum!=total){System.out.println("没找到");}sum=0;}//System.out.println(hasPathSum(treeNode,8));}
}

在这里插入图片描述
找和为8的路径,找到了。(1,2,5)
在这里插入图片描述

力扣提交

力扣代码如下:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public static void dfs(TreeNode root, String path, List ans){if(root!=null){StringBuffer sb = new StringBuffer(path);sb.append(root.val);if(root.left==null&&root.right==null){ans.add(sb.toString());return ;}else {sb.append("->");dfs(root.left,sb.toString(),ans);dfs(root.right,sb.toString(),ans);}return ;}}public boolean hasPathSum(TreeNode root, int targetSum) {System.out.println("遍历所有路径");//1 2 4 0 0 5 0 0 3 0 6//ans存储所有的路径List ans = new ArrayList<>();dfs(root,"",ans);int length = 0;for (int i =0;i//System.out.println(ans.get(i));String str = ans.get(i);String[] strs=str.split("->");System.out.println(Arrays.toString(strs));length = Math.max(length,strs.length);}System.out.println(length);int result[][] = new int[ans.size()][length];for (int i =0;i//System.out.println(ans.get(i));String str = ans.get(i);String[] strs=str.split("->");for (int j =0;jresult[i][j]= Integer.parseInt(strs[j]);}}int total = targetSum;int sum = 0;for (int i =0;ifor (int  j=0;jsum += result[i][j];}if(sum==total){System.out.println("找到了");return true;}if(i==ans.size()-1&&sum!=total){System.out.println("没找到");return false;}sum=0;}return false;}
}

在这里插入图片描述
在这里插入图片描述

求路径(中间一段)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

C++实现

#include 
#include 
using namespace std;
const int N = 10010;
int T[N];
int dis;
int p[N];int a[] = {0, 8, 5, 7, 1, 2};void printPath(int j){for(int i = 0; i <= j; i ++){if(p[i] == 0){continue;}printf("%d ", p[i]);}printf("\n");return;
}void findPath(int i, int j, int d, int length){if (a[i] == dis){printf("%d\n", a[i]);return;}d += a[i];p[j] = a[i];if (d == dis){printPath(j);return;}if (d < dis){if(2 * i <= length){findPath(2 * i, j + 1, d, length);}if(2 * i + 1 <= length){findPath(2 * i + 1, j + 1, d, length);}}return;}int main(){scanf("%d", &dis);int length = 5;for(int i = 1; i <= length; i ++){memset(p, 0, sizeof p);findPath(i, 0, 0, length);}system("pause");
}

在这里插入图片描述

打印根节点到任意节点的路径

在这里插入图片描述
例如1 到18路径为:1 9 14 15 17 18

JAVA实现

package algorithmProblem;import java.util.*;public class bTree112Re {//静态内部类//二叉树节点public static class TreeNode{int data;bTree112Re.TreeNode leftChild;bTree112Re.TreeNode rightChild;public TreeNode(int data) {this.data = data;}}/*** 前序遍历的链表节点的顺序.来创建二叉树* @param inputList* @return*/public static bTree112Re.TreeNode precreatBinaryTree(LinkedList inputList){bTree112Re.TreeNode node = null;if(inputList==null||inputList.isEmpty()){return null;}Integer data = inputList.removeFirst();if(data!=null){//根左右。。。。node = new bTree112Re.TreeNode(data);node.leftChild=precreatBinaryTree(inputList);node.rightChild = precreatBinaryTree(inputList);}//将根节点返回(用于遍历,不返回根节点,这个树怎么找。。。。。)return node;}/*** 前序遍历* @param node*/public static void preOrderTraveral(bTree112Re.TreeNode node){if(node==null){return;}System.out.println(node.data);preOrderTraveral(node.leftChild);preOrderTraveral(node.rightChild);}public static void dfs(bTree112Re.TreeNode root, String path, List ans){if(root!=null){StringBuffer sb = new StringBuffer(path);sb.append(root.data);if(root.leftChild==null&&root.rightChild==null){ans.add(sb.toString());return ;}else {sb.append("->");dfs(root.leftChild,sb.toString(),ans);dfs(root.rightChild,sb.toString(),ans);}return ;}}public ArrayList> binaryTreePaths(bTree112Re.TreeNode root) {List ans = new ArrayList<>();ArrayList> list = new ArrayList>();LinkedList mylist = new LinkedList();dfs(root,"",ans);return list;}/*** 打印根节点到任意节点的路径* @param root 根引用(指针)* @param rootData 根节点数据值* @param leafData 任意子节点数据值* @return*/public static LinkedList findPath(bTree112Re.TreeNode root, int rootData,int leafData) {System.out.println("遍历所有路径");//1 2 4 0 0 5 0 0 3 0 6//ans存储所有的路径List ans = new ArrayList<>();dfs(root,"",ans);int length = 0;for (int i =0;i//System.out.println(ans.get(i));String str = ans.get(i);String[] strs=str.split("->");System.out.println(Arrays.toString(strs));length = Math.max(length,strs.length);}//System.out.println(length);int result[][] = new int[ans.size()][length];for (int i =0;i//System.out.println(ans.get(i));String str = ans.get(i);String[] strs=str.split("->");for (int j =0;jresult[i][j]= Integer.parseInt(strs[j]);}}int start = rootData;int end = leafData;LinkedList resultList = new LinkedList();for (int i =0;iresultList.clear();int path = 100000;for (int  j=0;j//sum += result[i][j];if(start==result[i][j]){resultList.add(result[i][j]);path = j;}if(pathresultList.add(result[i][j]);}if(end==result[i][j]){return resultList;}}}return null;}public static void main(String[] args) {//前序创建二叉树//LinkedList inputList = new LinkedList(Arrays.asList(new Integer[]{1,2,4,null,null,5,null,null,3,null,6}));//LinkedList inputList = new LinkedList(Arrays.asList(new Integer[]{8,5,1,null,null,2,null,null,7}));LinkedList inputList = new LinkedList(Arrays.asList(new Integer[]{}));
//        inputList.add(8);
//        inputList.add(5);
//        inputList.add(1);
//        inputList.add(null);
//        inputList.add(null);
//        inputList.add(2);
//        inputList.add(null);
//        inputList.add(null);
//        inputList.add(7);System.out.println("请按照前序输入二叉树节点:");Scanner in =new Scanner(System.in);int a=0;Scanner sc = new Scanner(System.in);String inputString = sc.nextLine();String stringArray[] = inputString.split(" ");int num[] = new int[stringArray.length];for (int i = 0; i < stringArray.length; i++) {if(Integer.parseInt(stringArray[i])==0){inputList.add(null);}else {inputList.add(Integer.parseInt(stringArray[i]));}}System.out.println("二叉树构建成功!");bTree112Re.TreeNode treeNode = precreatBinaryTree(inputList);System.out.println("前序遍历如下:");preOrderTraveral(treeNode);LinkedList list = new LinkedList();Scanner sin =new Scanner(System.in);int exit=0;int rootData=0;int leafData=0;while (exit!=-1){System.out.println("请输入起始查找节点的值");rootData=sin.nextInt();//输入一个整数System.out.println("请输结束位置节点的值");leafData=sin.nextInt();//输入一个整数list = findPath(treeNode,rootData,leafData);if(list!=null){System.out.print("路径为: ");for (int i =0;iSystem.out.print(list.get(i)+" ");}}else {System.out.println("路径不存在.....请重新输入");}System.out.println("如果退出,请输入-1......");System.out.println("如果继续查找,按任意键继续.....");exit=sin.nextInt();//输入一个整数System.out.println("请继续输入节点值...");}}
}

在这里插入图片描述
在这里插入图片描述

相关内容

热门资讯

少儿活动主持人主持词 少儿活动主持人主持词  主持词需要富有情感,充满热情,才能有效地吸引到观众。我们眼下的社会,主持人参...
晚会主持词开场白 【必备】晚会主持词开场白(通用13篇)  主持词已成为各种演出活动和集会中不可或缺的一部分。在人们越...
六一儿童节鼓励致辞 六一儿童节鼓励致辞(通用20篇)  无论是身处学校还是步入社会,说到致辞,大家肯定都不陌生吧,致辞具...
幼儿园元旦联欢会主持词 2014年幼儿园元旦联欢会主持词2014年幼儿园元旦联欢会主持词1师:尊敬的各位老师幼:亲爱的小朋友...
同学会联欢会主持词 同学会联欢会主持词  借鉴诗词和散文诗是主持词的一种写作手法。在一步步向前发展的社会中,越来越多的活...
搞笑脱口秀台词脱口秀台词 搞笑脱口秀台词脱口秀台词1100字校园脱口秀台词每天,当我的双脚迈入合肥七中的大门,强相互作用会把我...
学生会换届大会主持词 学生会换届大会主持词  主持词的内容  主持词一般由开场白、中间部分与结束语组成。  开场白 演出或...
教研活动公开课主持稿   教研活动公开课主持稿  篇一:数学教研活动主持词  各位领导、各位老师,大家好!  在这样一个春...
《花木兰》感人台词 《花木兰》感人台词  壹 孝,替父从军父女情  感人段落:军令如山,花弧爱国心切,无奈年老气衰,百病...
红歌赛主持词 红歌赛主持词  由主持人于节目进行过程中串联节目的串联词。如今的各种演出活动和集会中,主持人往往成了...
联欢晚会主持词 联欢晚会主持词3篇  主持词可以采用和历史文化有关的表述方法去写作以提升活动的文化内涵。在如今这个时...
金榜题名主持词 金榜题名主持词(精选23篇)  主持词要根据活动对象的不同去设置不同的主持词。随着社会一步步向前发展...
光荣退休领导致辞 光荣退休领导致辞范文(通用5篇)  在学习、工作或生活中,要用到致辞的情况还是蛮多的,致辞是指在仪式...
大学迎新晚会主持词 大学迎新晚会主持词  迎新,全称迎接新春,又叫迎接新年。迎新是中国的传统节日形式。或者欢迎、迎接新来...
教师节校长简短致辞 教师节校长简短致辞(通用10篇)  在日常学习、工作抑或是生活中,大家或多或少都用到过致辞吧,在各种...
张国荣经典台词 关于张国荣经典台词  1、哭,我为了感动谁,笑,又为了碰着谁。  ——《路过蜻蜓》  2、虽然我很喜...
新郎婚礼简短致辞 新郎婚礼简短致辞(精选10篇)  在平平淡淡的学习、工作、生活中,大家都经常接触到致辞吧,致辞是指在...
美剧经典台词截图 美剧经典台词截图  在社会发展不断提速的今天,用到台词的地方越来越多,台词是一种特殊的文学语言,必须...
女朋友撒娇的经典台词 女朋友撒娇的经典台词  1、这种被朋友的情况让我很失落,因为我喜欢他。  2、“她就是躲着我我该怎么...
会主持词开场白 会主持词开场白  篇一  尊敬的各位领导、各位来宾  各位公司同仁:  大家下午好!  非常高兴和大...