前言
二叉树的题目确定遍历顺序很关键,此外递归逻辑可以简化成只有根节点的处理情况,非递归好像用层序遍历都可以解决,但要等到二刷的时候再处理了。
Leetcode224 翻转二叉树
题目链接:226. 翻转二叉树 - 力扣(LeetCode)
代码随想录题解:代码随想录 (programmercarl.com)
思路:先确定遍历顺序,前序和后序都可以,前序的逻辑是从上到下翻转而后序的逻辑是从下到上翻转。递归逻辑简化只有根结点的处理情况就是传入根节点,翻转左右孩子,传入左孩子和右孩子
代码:
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root==NULL)
{
return NULL;
} //前序遍历
swap(root->left, root->right); // 中
invertTree(root->left); // 左
invertTree(root->right); // 右
return root;
}
};
Leetcode101 对称二叉树
题目链接:101. 对称二叉树 - 力扣(LeetCode)
代码随想录题解:代码随想录 (programmercarl.com)
思路:先确定遍历顺序,这个题其实在两个树上遍历,一个是左右中,一个是右左中,但其实不重要。简化递归为只有根节点分情况:先传入根节点的左右,左空右不空,左不空右空,左右都不空但数值不等,左右都空。前三种都不对称,只有第四种对称。这里需要注意左右都不空且数值相等,这时候不能直接推断对称,还必须判断他们下面的节点是否也对称。
代码:
class Solution {
public:
bool compare(TreeNode* left,TreeNode* right)
{
if(left!=NULL&&right==NULL)//左不空右空
{
return false;
}
else if(left==NULL&&right!=NULL)//左空右不空
{
return false;
}
else if(left==NULL&&right==NULL)//左右都空
{
return true;
}
else if(left->val!=right->val)//左右都不空但数值不等
{
return false;
}
else return compare(left->left,right->right)&&compare(left->right,right->left);
} //左右不空且数值相等 需要判断下面节点的情况
bool isSymmetric(TreeNode* root) {
if(root==NULL)
{
return true;
}
return compare(root->left,root->right);
}
};
Leetcode104 二叉树的最大深度
题目链接:104. 二叉树的最大深度 - 力扣(LeetCode)
代码随想录题解:代码随想录 (programmercarl.com)
思路:求深度就是一直往下,所以很明显是左右中,把左右的深度结果返回给中。递归简化:传入根节点,求左右子树的深度,返回最大值给根节点。
代码:
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root==NULL)
{
return 0;
}
int leftdepth=maxDepth(root->left);
int rightdepth=maxDepth(root->right);
int depth=1+max(leftdepth,rightdepth);
return depth;
}
};
Leetcode 111 二叉树的最小深度
题目链接:111. 二叉树的最小深度 - 力扣(LeetCode)
代码随想录题解:代码随想录 (programmercarl.com)
思路:求深度基本一样,但要注意最小深度是根节点到叶子节点。所以,如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。 最后如果左右子树都不为空,返回左右子树深度最小值 + 1 。
代码:
class Solution {
public:
int minDepth(TreeNode* root) {
if(root==NULL)
{
return 0;
}
int leftdepth=minDepth(root->left);
int rightdepth=minDepth(root->right);
if(root->left==NULL&&root->right!=NULL)
{
return 1+rightdepth;
}
if(root->left!=NULL&&root->right==NULL)
{
return 1+leftdepth;
}
return 1+min(leftdepth,rightdepth);
}
};
总结
二叉树的题要理解遍历顺序和递归逻辑才能更好的记忆。