代码随想录day15--二叉树的应用3

LeetCode110--平衡二叉树

题目描述:

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:代码随想录day15--二叉树的应用3_第1张图片

输入:root = [3,9,20,null,null,15,7]
输出:true

示例 2:

代码随想录day15--二叉树的应用3_第2张图片

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例 3:

输入:root = []
输出:true

解题思路:

·首先需要搞明白什么是平衡二叉树,明白什么样属于平衡二叉树,什么样不属于平衡二叉树

·平衡二叉树比较的是高度,所以一定是使用后序遍历

·使用递归法,分别求出左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,说明不是平衡二叉树

代码如下:

class Solution {
public:
    int getHeight(TreeNode* node){
        if(node == NULL) return 0;
        int leftHeight = getHeight(node->left);
        if(leftHeight == -1) return -1;
        int rightHeight = getHeight(node->right);
        if(rightHeight == -1) return -1;
        int result;
        if(abs(leftHeight - rightHeight) > 1){
            result = -1;
        }else{
            result = 1+max(leftHeight,rightHeight);
        }
        return result;
    }
    bool isBalanced(TreeNode* root) {
        return getHeight(root) == -1?false:true;
    }
};

总结:一定要搞明白,深度和高度的概念和区别,求深度就使用先序遍历,求高度就使用后序遍历,这道题也可以使用迭代法进行求解,但是这题使用迭代法进行求解效率比较低。

LeetCode257.二叉树的所有路径

题目描述:

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

示例 1:

代码随想录day15--二叉树的应用3_第3张图片

输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]

示例 2:

输入:root = [1]
输出:["1"]

解题思路:

·解这道题需要使用先序遍历,进行求解,因为题目要求从根节点到叶子的路径,所有需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。

·解题所需要使用的是回溯法,因为我们需要把路径记录下,需要回溯回退一个路径再进入1另一个路径。

代码如下:

class Solution {
    private:
    void traversal(TreeNode* cur,vector& path,vector& result){
        path.push_back(cur->val);//根节点,因为最后遍历的一个结点也要加入到path中,不能在这个if之后
        if(cur->left == NULL && cur->right == NULL){
            string sPath;
            for(int i = 0;i < path.size()-1;i++){
                sPath += to_string(path[i]);
                sPath += "->";
            }
            sPath += to_string(path[path.size()-1]);
            result.push_back(sPath);
        }
        if(cur->left){
            traversal(cur->left,path,result);
            path.pop_back();//回溯
        }
        if(cur->right){
            traversal(cur->right,path,result);
            path.pop_back();//回溯
        }
    }
public:
    vector binaryTreePaths(TreeNode* root) {
        vector result;
        vector path;
        if(root == NULL) return result;
        traversal(root,path,result);
        return result;
    }
};

易错点:

·回溯和递归是一一对应的,有一个递归,就要有一个回溯,不能拆开,有些同学在书写的时候容易出现错误

·依旧是老生常谈的问题,也就是递归三部曲的确定,如果无法正确的确定,那么久无法正确写出

总结:

这是第一次使用回溯法,虽然题目相对而言比较简单,但是代码充分的体现了回溯思想。有很多同学表示自己不会回溯法,但是其实在写递归的时候,无形之中就在使用回溯法,只是并没意识到而已。

LeetCode404.左叶子之和

题目描述:

给定二叉树的根节点 root ,返回所有左叶子之和。

示例 1:

代码随想录day15--二叉树的应用3_第4张图片

输入: root = [3,9,20,null,null,15,7] 
输出: 24 
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

示例 2:

输入: root = [1]
输出: 0

解题思路:
·一定要搞明白题目的问题,左叶子之和是指,左右子树中左叶子结点之和,并不是左子树的叶子结点之和

·如何判断当前结点是左叶子结点,这个问题可能困扰了部分同学,可以使用递归法,判断一个结点是否有左结点,再判断这个结点的左结点的左结点和这个结点的左结点的右节点是否存在(判断是否为叶子结点)即可

*本题使用递归法的递归顺序为后序遍历,是因为要通过递归函数的返回值来累加求取左叶子数值之和

代码如下:

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        if(root == NULL) return 0;
        if(root->left == NULL && root->right == NULL) return 0;
        int leftValue = sumOfLeftLeaves(root->left);
        if(root->left && !root->left->left && !root->left->right){
            leftValue = root->left->val;
        }
        int rightValue = sumOfLeftLeaves(root->right);
        int sum = leftValue+rightValue;
        return sum;
    }
};

总结:这道题目要求左叶子之和,唯一的难点就是如何判断本节点是不是左叶子节点。

这个就要通过节点的父节点来判断其左孩子是不是左叶子了。

你可能感兴趣的:(数据结构,算法)