二叉树节点和+递归Java_二叉树根节点到叶子结点的路径:递归与非递归

该博客介绍了如何使用Java通过递归和非递归方法找到二叉树中从根节点到叶子节点的所有路径及其路径和。创建了一棵二叉树,并提供了三种方法:深度优先搜索(DFS)、自定义方法getPath和广度优先搜索(BFS)的binaryTreePaths方法来解决此问题。博客最后展示了示例代码并输出了结果。
摘要由CSDN通过智能技术生成

package 二叉树;

import java.util.*;

public class 二叉树根到叶子节点的路径和 {

public static TreeNode root;

public static Set> set = new HashSet<>();

public static List list = new ArrayList<>();

public static List sum = new ArrayList<>();

public static void createTree(Integer[] objects){

List datas = new ArrayList<>();//存储所有节点

for(Integer obj:objects){

datas.add(new TreeNode(obj));

}

root = datas.get(0);//将一个作为根节点

for(int i = 0;i < objects.length/2;i++){

datas.get(i).left = datas.get(2*i+1);

if(2*i+2 < objects.length){//避免偶数的时候,下标越界

datas.get(i).right = datas.get(2*i+2);

}

}

}

public static void DFS(TreeNode T,int preVal,List list){

if(T!=null){

preVal+=T.val;

list.add(T.val);

if(T.left==null&&T.right==null){

System.out.println(list);

set.add(new ArrayList<>(list));

sum.add(preVal);

}else{

DFS(T.left,preVal,list);

DFS(T.right,preVal,list);

}

//当T是叶子节点,在当前递归状态下需要剔除该元素

list.remove(list.size()-1);

}

}

public static void getPath(TreeNode root,List list,int num){

if(root!=null) {

num+=root.val;

list.add(root.val);

}

if(root.left == null && root.right == null){

System.out.print(num+"=");

System.out.println(list);

sum.add(num);

set.add(new ArrayList<>(list));

}

if(root.left != null)

getPath(root.left,list,num);

if(root.right != null)

getPath(root.right,list,num);

list.remove(list.size()-1);

}

public static List binaryTreePaths(TreeNode root) {

List list=new ArrayList();

Queue queue=new LinkedList();

Queue qStr=new LinkedList();

if (root==null) return list;

queue.add(root);

qStr.add("");

while(!queue.isEmpty()) {

TreeNode curNode=queue.remove();

String curStr=qStr.remove();

if (curNode.left==null && curNode.right==null) list.add(curStr+curNode.val);

if (curNode.left!=null) {

queue.add(curNode.left);

qStr.add(curStr+curNode.val+"->");

}

if (curNode.right!=null) {

queue.add(curNode.right);

qStr.add(curStr+curNode.val+"->");

}

}

return list;

}

public static void main(String[] args) {

Integer[] arr = {1,3,2,4,5,2,1};

createTree(arr);

DFS(root,0,list);

sum.clear();

getPath(root,list,0);

System.out.println(sum);

System.out.println(set);

System.out.println(binaryTreePaths(root));

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值