二叉树中的深搜 算法专题

二叉树中的深搜

在这里插入图片描述

一. 计算布尔二叉树的值

计算布尔二叉树的值

class Solution {
    
    
    public boolean evaluateTree(TreeNode root) {
    
    
        if(root.left == null) return root.val == 0? false: true;

        boolean left = evaluateTree(root.left);
        boolean right = evaluateTree(root.right);
         
        return root.val == 2 ? left | right : left & right;

    }
}

二. 求根节点到叶子结点数字之和

求根节点到叶子结点数字之和

class Solution {
    
    
    public int sumNumbers(TreeNode root) {
    
    
        return dfs(root, 0);
    }

    public int dfs(TreeNode root, int sum){
    
    
        if(root == null) return 0;
        int tmp = sum * 10 + root.val;
        if(root.left == null && root.right == null){
    
    
            return tmp;
        }

        return dfs(root.left, tmp) + dfs(root.right, tmp);


    }
}

三. 二叉树剪枝

二叉树剪枝

class Solution {
    
    
    public TreeNode pruneTree(TreeNode root) {
    
    
        if (root == null)
            return root;
        root.left = pruneTree(root.left);
        root.right = pruneTree(root.right);
        if (root.left == null && root.right == null && root.val == 0)
            return null;
        return root;
    }
}

四. 验证二叉搜索树

验证二叉搜索树

class Solution {
    
    
    long prev = Long.MIN_VALUE;
    public boolean isValidBST(TreeNode root) {
    
    
        if(root == null) return true;
        //判断左子树是否是二叉搜索树
        boolean left = isValidBST(root.left);
        //剪枝
        if(left == false) return false;
        //判断当前结点是否是二叉搜索树
        boolean cur = false;
        if(root.val > prev) cur = true;
        //剪枝
        if(cur == false) return false;

        prev = root.val;

        //判断右子树是否是二叉搜索树
        boolean right = isValidBST(root.right);

        return left && cur && right;
        
    }
}

五. 二叉搜索树中第k小的元素

二叉搜索树中第k小的元素

class Solution {
    
    
    int count;
    int ret;

    public int kthSmallest(TreeNode root, int k) {
    
    
        count = k;
        dfs(root);
        return ret;
    }

    public void dfs(TreeNode root) {
    
    
        if (root == null)
            return;
        //剪枝
        if (count == 0)
            return;
        dfs(root.left);
        count--;
        if (count == 0) {
    
    
            ret = root.val;
            //剪枝
            return;
        }
        dfs(root.right);
    }
}

六. 二叉树的所有路径

二叉树的所有路径

class Solution {
    
    
    List<String> ret = new ArrayList<>();

    public List<String> binaryTreePaths(TreeNode root) {
    
    
        StringBuffer path = new StringBuffer();
        dfs(root, path);
        return ret;
    }

    public void dfs(TreeNode root, StringBuffer _path){
    
    
        //让每次递归修改的不是同一个path----'还原现场'
        StringBuffer path = new StringBuffer(_path);

        if(root == null) return ;
        path.append(Integer.toString(root.val));
        //如果是叶子结点
        if(root.left == null && root.right == null) {
    
    
        ret.add(path.toString());//结果加入到ret中
        return;
        }
        //不是叶子结点
        path.append("->");
        dfs(root.left, path);
        dfs(root.right, path);
        
    }
}

猜你喜欢

转载自blog.csdn.net/m0_73992740/article/details/143401814