分治递归的思想
递归问题两个条件:1、子问题(一颗树分成3个部分:根+左子树+右子树) 2、返回条件(空树)
1.单值二叉树
题目描述:如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回 true
;否则返回 false
。
bool isUnivalTree(struct TreeNode* root){
if(root==NULL)
return true;
if(root->left && root->left->val != root->val)
return false;
if(root->right && root->right->val != root->val)
return false;
return isUnivalTree(root->left) && isUnivalTree(root->right);
}
2. 二叉树的最大深度
题目描述:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
必须后序遍历方式
int maxDepth(struct TreeNode* root){
if(root==NULL)
return 0;
int leftDepth = maxDepth(root->left);
int rightDepth = maxDepth(root->right);
return leftDepth > rightDepth ? leftDepth+1 : rightDepth +1;
}
3. 翻转二叉树
思想:1. 空 返回 2. 非空 交换左右孩子 继续翻转左右字数
struct TreeNode* invertTree(struct TreeNode* root){
if(root==NULL)
return NULL;
struct TreeNode* tmp = root->right;
root->right = root ->left;
root->left =tmp;
invertTree(root->left);
invertTree(root->right);
return root;
}
4. 检查两颗树是否相同
题目描述:给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
两颗树相同 1、两颗树根的结构和值相同 2、两颗树的左右子树相同
bool isSameTree(struct TreeNode* p, struct TreeNode* q){
if(p==NULL && q==NULL)
return true;
//结构不相同
if(p==NULL || q== NULL)
return false;
//p和q都不为空,值不同
if(p->val != q->val)
return false;
//根的结构和值都相同,继续去判断左右子树s是否相同
return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}
5.对称二叉树
题目描述:给定一个二叉树,检查它是否是镜像对称的。
对称: 将左子树和右子树看作两棵树,比较左子树的左子树是否和右子树的右子树是否相同。
bool _isSymmetric(struct TreeNode* p, struct TreeNode* q){
if(p==NULL && q==NULL)
return true;
//结构不相同
if(p==NULL || q== NULL)
return false;
//p和q都不为空,值不同
if(p->val != q->val)
return false;
//根的结构和值都相同,继续去判断左右子树s是否相同
return _isSymmetric(p->left,q->right) && _isSymmetric(p->right,q->left);
}
bool isSymmetric(struct TreeNode* root){
if(root==NULL)
return true;
return _isSymmetric(root->left,root->right);
}