二叉樹根節點到葉子結點的路徑:遞歸與非遞歸


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));
    }
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM