程式碼隨想錄演算法訓練營第15天 | 二叉樹進階

hailicy發表於2024-07-21

2024年7月17日

平衡二叉樹

/**
 * 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 boolean isBalanced(TreeNode root) {
        if(digui(root)==1){
            return true;
        }else{
            return false;
        }
    }

    public int digui(TreeNode root){
        if(root==null){
            return 1;
        }
        int h1 = height(root.left);
        int h2 = height(root.right);
        if(Math.abs(h1-h2)>1){
            return 0;
        }else{
            return digui(root.left)*digui(root.right);
        }
    }

    public int height(TreeNode root){
        int height=1;
        if(root==null){
            return 0;
        }else{
            return Math.max(he(root.left,height),he(root.right,height));
        }
    }

    public int he(TreeNode root, int height){
        if(root!=null){
            height+=1;
            return Math.max(he(root.left,height),he(root.right,height));
        }else{
            return height;
        }
    }
}

題257. 二叉樹的所有路徑
涉及回溯,所以把路徑記錄設定為類成員,這樣就不用反覆傳遞了。

import java.util.*;

class Solution {

    Vector<Integer> vec;

    public List<String> binaryTreePaths(TreeNode root) {
        List<String> list = new ArrayList<>();
        vec = new Vector<>();
        vec.add(root.val);
        if(root.left==null&& root.right==null){
            list.add(""+root.val);
            return list;
        }
        if(root.left!=null){
            list = digui(root.left,list);
        }
        if(root.right!=null){
            list = digui(root.right,list);
        }
        return list;
    }

    public List<String> digui(TreeNode root,List<String> list){
        vec.add(root.val);
        if(root.left==null && root.right==null){
            
            String res1 = "";
            for(int i=0;i<vec.size()-1;i++){
                res1+=vec.get(i);
                res1+="->";
            }
            res1+=vec.get(vec.size()-1);
            list.add(res1);
            
            
        }else{
            if(root.left!=null){
                list = digui(root.left,list);
            }
            if(root.right!=null){
                list = digui(root.right,list);
            }
            
        }
        vec.remove(vec.size()-1);
        return list;
    }
}

題404. 左葉子之和
用一個標誌位來記錄當前節點是左子還是右子,如果是左子,就再判斷是不是葉子節點,如果是才加上值。

class Solution {

    int sum;

    public int sumOfLeftLeaves(TreeNode root) {
        if(root==null){
            return 0;
        }
        if(root.left==null&&root.right==null){
            return 0;
        }
        sum=0;
        if(root.left!=null){
            digui(root.left,1);
        }
        if(root.right!=null){
            digui(root.right,0);
        }
        return sum;
    }

    public void digui(TreeNode root,int bool){
        if(root.left==null && root.right==null && bool==1){
            sum+=root.val;
            return;
        }
        if(root.left!=null){
            digui(root.left,1);
        }
        if(root.right!=null){
            digui(root.right,0);
        }
        return;
    }
}

相關文章