平衡二叉树:
思路:
递归法:后序遍历,先一直递进,递进到树的最左侧最深处,从最底部开始计数并且判断左右子节点的高度是否平衡,如果不平衡,那么层层返回-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