每日一练——二叉树

作者:~小明学编程  

文章专栏:每日一练——Java

格言:认真刷题的一天

二叉树的最大深度

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    private int depth (TreeNode root) {
        if(root==null) return 0;
        int leftLength = depth(root.left)+1;
        int rightLength = depth(root.right)+1;
        return leftLength>rightLength?leftLength:rightLength;
        
    } 
    public int maxDepth (TreeNode root) {
        // write code here
        if(root==null) return 0;
        return depth(root);
    }
}

二叉树的最大深度:此题的目的就是求我们二叉树的最大深度,这里我们采用的是递归的方式这样可以让我们的代码看起来比较的简单,首先就是我们要对我们的root进行一个空值的判断,接着就是到了我们的核心的方法depth(),我们想要求深度的话就必须要对比我们左边和右边的深度然后取最深的那一个,代码如上此题比较的简单。

二叉树中和为某一值的路径(一)

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @param sum int整型 
     * @return bool布尔型
     */
    private boolean help(TreeNode root,int target) {
        if(root==null) return false;
        target -= root.val;
        if(target==0&&root.left==null&&root.right==null) {
            return true;
        } 
        return help(root.left,target)||help(root.right,target);

    }
    public boolean hasPathSum (TreeNode root, int sum) {
        // write code here
        if(root==null) return false;
        return help(root,sum);
    }
}

描述

给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。

1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点

2.叶子节点是指没有子节点的节点

3.路径只能从父节点到子节点,不能从子节点到父节点

4.总节点数目为n

解析:此题的解决方法在于我们要用减法的思想去解决,题目中说的是二叉树中的某一条的路径只和是sum我们就很容易想到从根去开始遍历然后去求和,但是这种情况我们需要去记录一个变量然后去比较,这个时候我们换个思路去用减法来解决问题,将我们的目标值通过每个节点对其减法处理等其为0并且是叶子结点就是说明该路径没问题返回true,否则就是false。

二叉搜索树与双向链表

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    private TreeNode prve = null;
    private void minTree(TreeNode root) {
        if(root==null) {
            return;
        }
        minTree(root.left);
        root.left = prve;
        if(prve!=null) prve.right = root;
        prve = root;
        minTree(root.right);
    }

    public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree == null) return null;
        //先找到我们的头节点
        TreeNode cur = pRootOfTree;
        while(cur.left!=null) {
            cur = cur.left;
        }
        minTree(pRootOfTree);
        return cur;

        
    }
}

思路:这个题目这次已经是第三次做了,今天打算整理一下思路,每次做的时候都要看一下答案才有思路是在是不太行,首先我们拿到题目看起来就比较的复杂,我们如何将一颗二叉搜索树给转换成一个双向链表呢?

我们知道二叉搜索树有一个关键的特征这也是我们能解决这题的关键突破口,那就是二叉搜索树的中序遍历是有序的,所有我们就想到了对其进行中序遍历,在中序遍历的时候我们的需要记录我们所遍历的前面一个节点然后我们当前的左节点就是我们上一个所遍历的节点。但是问题来了我们的下一个节点怎么办,这个时候我们不妨换个思路,我门当前很难找到下一个节点但是我们容易找到我们的上一个节点,我们上一个节点的下一个节点不就是我们当前的节点吗,接着我们更新一下前驱节点就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值