代码随想录训练营第十五天 || 1.平衡二叉树 2.二叉树的所有路径 3.左叶子之和 4.完全二叉树的节点个数

平衡二叉树

讲解:代码随想录

思路:

递归法:后序遍历,先一直递进,递进到树的最左侧最深处,从最底部开始计数并且判断左右子节点的高度是否平衡,如果不平衡,那么层层返回-1,结束递归

代码:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        if self.panduan(root)!=-1:
            return True
        else :
            return False
    def panduan(self,root):
        if not root :#中止条件,说明此时到达最底部
            return 0
#先到达最低部,再开始判断
        if (lefthight :=self.panduan(root.left)) ==-1:
            return -1
        if (righthight :=self.panduan(root.right)) ==-1:
            return -1
        if abs(lefthight-righthight) >1:
            return -1
        else:
            return 1+max(lefthight,righthight)

遇到的问题:

1.对于递归思路的理解

二叉树的所有路径

讲解:代码随想录

思路:

递归法:使用前序遍历,因为记录二叉树的路径需要从根节点向末尾记录,而前序遍历就是从根节点开始每到一个结点先记录,再递进

代码:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        result = []
        path = []
        if not root :
            return []
        self.caozuo(root,path,result)
        return result


    def caozuo(self,root,path,result):
        path.append(root.val)
        if root.left == None and root.right ==None:
            
            spath = '->'.join(map(str,path))#map函数,在第二个可迭代容器中迭代元素,并逐一用来操作第一个参数的函数
            result.append(spath)
            return 
        if root.left:
            self.caozuo(root.left,path,result)
            path.pop()
        if root.right:
            self.caozuo(root.right,path,result)
            path.pop()
        
        

遇到的问题:

1.对于map()函数的使用:map(第一个参数,第二个参数),第一个参数是一个函数操作,第二个参数是一个可迭代的容器,作用就是逐一将第二个容器内的元素迭代并且进行第一个参数的操作

左叶子之和:

讲解:代码随想录

思路:

递归

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
 int sumcaozuo(struct TreeNode* cur);
int sumOfLeftLeaves(struct TreeNode* root) {
    return sumcaozuo(root);
}
int sumcaozuo(struct TreeNode* cur)
{
    if(cur==NULL)//终止条件,虽写在函数前面,但只有遍历到树的末端才会触发
    {
        return 0;
    }
    int leftval =sumcaozuo(cur->left);//先遍历到树最左端
    int rightval =sumcaozuo(cur->right);
    int midval=0;
    if (cur->left &&(cur->left->left ==NULL && cur->left->right==NULL))
    {
        midval = cur->left->val;
    }
    return midval+leftval+rightval;

}

遇到的问题:

完全二叉树的节点个数

讲解:代码随想录

思路:

通过前序遍历记录,并且可以通过判断是否为满二叉树来用公式直接计算节点数,判断方法是通过一直遍历结点的左结点和右节点,比较长度,如果相等则为满二叉树

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
int countNodes(struct TreeNode* root) {
    if(root==NULL)
    {
        return 0;
    }
    struct TreeNode*leftNode = root->left;
    struct TreeNode*rightNode = root->right;
    int leftlen=0,rightlen=0;
    while(leftNode)
    {
        leftNode=leftNode->left;
        leftlen++;
    }
    while(rightNode)
    {
        rightNode=rightNode->right;
        rightlen++;
    }
    if(rightlen==leftlen)
    {
        return (2 << leftlen) - 1;
    }
    return countNodes(root->left)+countNodes(root->right)+1;
}

遇到的问题:

1.对于幂运算不清楚:第一种pow函数,适合浮点数的运算,第二种位运算,比如3的2次方,3<<2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值