zoukankan      html  css  js  c++  java
  • 二叉树根节点到叶子结点的路径:递归与非递归

    package 二叉树;
    
    import java.util.*;
    
    public class 二叉树根到叶子节点的路径和 {
    
        public static TreeNode root;
        public static Set<List<Integer>> set = new HashSet<>();
        public static List<Integer> list = new ArrayList<>();
        public static List<Integer> sum = new ArrayList<>();
    
        public static void createTree(Integer[] objects){
            List<TreeNode> 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<Integer> 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<Integer> 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<String> binaryTreePaths(TreeNode root) {
            List<String> list=new ArrayList<String>();
            Queue<TreeNode> queue=new LinkedList<TreeNode>();
            Queue<String> qStr=new LinkedList<String>();
            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));
        }
    }
    

      

  • 相关阅读:
    Log4j appender、layout
    EhCache缓存框架的使用
    Log4j rootLogger根配置以及4种日志级别
    开发chrome 插件, background.js中 console log 看不到解决方法
    Windows cmd 长时间不输出新内容 直到按下ctrl + c 取消或者回车的解决办法
    如何查看当前分支从哪个支线创建而来
    C# 获取相对路径的字符串
    解决adobe air sdk打包 apk后自动在包名前面加上air. (有个点)前缀的问题
    sublime text 输入法候选词不跟随光标
    Windows 批处理设置dns ,解决能上qq不能开网页
  • 原文地址:https://www.cnblogs.com/czsblog/p/11581436.html
Copyright © 2011-2022 走看看