翻转二叉树
题目链接:. - 扣(LeetCode)
讲解视频:听说一位巨佬面Google被拒了,因为没写出翻转二叉树 | LeetCode:226.翻转二叉树
题目描述:
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
示例 1:
输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]
解题思路:
中操作:交换左右子树
解题方法:
- 自上而下交换左右子树-->前序遍历
- 自下而上交换左右子树-->后序遍历
代码:
后序遍历代码:
class Solution {
public:
void recursion(TreeNode* root)
{
if(root == nullptr) return;
invertTree(root->left);
invertTree(root->right);
swap(root->left,root->right);
}
TreeNode* invertTree(TreeNode* root) {
recursion(root);
return root;
}
};
前序遍历代码:
class Solution {
public:
void recursion(TreeNode* root)
{
if(root == nullptr) return;
swap(root->left,root->right);
invertTree(root->left);
invertTree(root->right);
}
TreeNode* invertTree(TreeNode* root) {
recursion(root);
return root;
}
};
注意
中序遍历不能直接用此方法。如图所示,通过此方法发现原先右子树没有反转操作,原先左子树被反转两次
对称二叉树
题目链接:. - 力扣(LeetCode)
讲解视频:同时操作两个二叉树 | LeetCode:101. 对称二叉树
题目描述:
给你一个二叉树的根节点 root
, 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3] 输出:true
解题思路:
左子树的后序遍历
左操作:使用左节点的左子树与右节点的右子树进行操作
右操作:使用左节点的右子树与右节点的左子树进行操作
中操作:汇集左右操作的结果
代码:
class Solution {
public:
bool compare(TreeNode* left, TreeNode* right)
{
if(!left && right) return false;
if(left && !right) return false;
if(!left && !right) return true;
if(left->val != right->val) return false;
bool outside = compare(left->left,right->right);
bool inside = compare(left->right, right->left);
return outside && inside;
}
bool isSymmetric(TreeNode* root) {
if(root == nullptr) return true;
return compare(root->left,root->right);
}
};
二叉树的最大深度
题目链接:. - 力扣(LeetCode)
讲解视频:二叉树的高度和深度有啥区别?究竟用什么遍历顺序?很多录友搞不懂 | 104.二叉树的最大深度
题目描述:
给定一个二叉树 root
,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:3
高度与深度关系
高度:节点到叶子节点的距离
深度:节点到根节点距离
解题思路:
结论:树的最大高度=树的最大深度
使用后序遍历通过求解树的最大高度进而得到数的最大深度
中操作:保存左右操作中得到的最大高度
代码:
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root == nullptr) return 0;
int leftheight = maxDepth(root->left);
int rightheight = maxDepth(root->right);
return 1+ (leftheight > rightheight ? leftheight : rightheight);
}
};
二叉树的最小深度
题目链接:. - 力扣(LeetCode)
讲解视频:看起来好像做过,一写就错! | LeetCode:111.二叉树的最小深度
题目描述:
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:2
解题思路:
最小深度与最大深度解题思路类似,不同点在于最小深度中会增加两个判断条件:
- 左子树为空,右子树不为空
- 左子树不为空,右子树为空
代码:
class Solution {
public:
int minDepth(TreeNode* root) {
if(root == nullptr) return 0;
int leftheight = minDepth(root->left);
int rightheight = minDepth(root->right);
int result;
if(!leftheight && rightheight) result = rightheight+1;
else if(leftheight && !rightheight) result = leftheight+1;
else result = 1 + (rightheight > leftheight ? leftheight : rightheight);
return result;
}
};