226.翻转二叉树
力扣题目链接听说一位巨佬面Google被拒了,因为没写出翻转二叉树 | LeetCode:226.翻转二叉树
1. if(root==nullptr) return root;
指的是跳出当前递归,并不是结束函数。
2. swap(root->left,root->right);函数交换两个子树,并不是两个值。
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root==nullptr)
return root;
swap(root->left,root->right);
invertTree(root->left);
invertTree(root->right);
return root;
}
};
101. 对称二叉树
同时操作两个二叉树 | LeetCode:101. 对称二叉树
注意避免空指针如: if(right==nullptr&&left==nullptr) return true;
两空不能和两个相等的值一起算,要避免空指针。
不需要显性的写两值相等就是true,至于为什么呢?
我的解释是若两值相等则直接return compare(nullptr,nullptr)&&compare(nullptr,nullptr);
该结果为true,若直接写两值相等返回ture,可能会遗漏对称性的全面检查。
class Solution {
public:
bool compare(TreeNode* left,TreeNode* right)
{
if(left!=nullptr&&right==nullptr) return false;
if(right!=nullptr&&left==nullptr) return false;
if(right==nullptr&&left==nullptr) return true;
if(right!=nullptr&&left!=nullptr&&right->val!=left->val) return false;
return compare(left->left,right->right)&&compare(left->right,right->left);
}
bool isSymmetric(TreeNode* root) {
if(root==nullptr)
return true;
return compare(root->left,root->right);
}
};
104.二叉树的最大深度
二叉树的高度和深度有啥区别?究竟用什么遍历顺序?很多录友搞不懂 | 104.二叉树的最大深度
求深度用前序遍历,高度用后序遍历。
最大深度即根节点的高度。
if(root==nullptr) return 0;
返回0指的是返回所在的递归结果为0,而不是结束函数。
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root==nullptr)
return 0;
int leftget=maxDepth(root->left);
int rightget=maxDepth(root->right);
int res=max(leftget,rightget)+1;
return res;
}
};
111.二叉树的最小深度
看起来好像做过,一写就错! | LeetCode:111.二叉树的最小深度
与104.求最大深度思路相同,但有些区别
需要注意有两种特殊情况 :
根节点的左右孩子其中一个为空时,求min()+1时容易算成深度为1。
下图为其中一种情况:左孩子为空
class Solution {
public:
int minDepth(TreeNode* root) {
if(root==nullptr)
return 0;
int leftget=minDepth(root->left);
int rightget=minDepth(root->right);
int res=min(leftget,rightget)+1;
if(root->right==nullptr)
return leftget+1;
if(root->left==nullptr)
return rightget+1;
return res;
}
};