day 14|翻转二叉树 对称二叉树 二叉树的最大深度 二叉树的最小深度
day 14|翻转二叉树 对称二叉树 二叉树的最大深度 二叉树的最小深度
226.翻转二叉树
听说一位巨佬面Google被拒了,因为没写出翻转二叉树 | LeetCode:226.翻转二叉树_哔哩哔哩_bilibili
笔记
用什么遍历顺序?
前序(中左右)或者后序(左右中)都行,但是中序的代码和这个两个不太一样,因为中序遍历是先遍历左树,再交换左右树,再遍历右树,此时右树其实就是我们原本的左树,会导致原本的右树根本没有遍历。
实操出现问题
递归调用是独立的函数调用,它们返回的值(即使您没有接收)和当前函数的返回值是两个不同的概念
代码/比较
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root==nullptr) return root;
else{
swap(root->left,root->right);
invertTree(root->left);
invertTree(root->right);
return root;
}
}
};
101. 对称二叉树
笔记:
对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。
只能使用后序遍历,因为要提前知道左右树能否反转才能在中间节点进行判断。
实操出现问题:
本题目中递归的几个要素:
1.我的递归应该返回什么值?传入什么参数?
(1).应该传入的是两个需要对比的节点指针值;
(2).返回的是false/true,代表着这两个节点及其子树是否能够反转;
2.我的递归从哪里停止?
(1).如果对比的两个节点都是空,返回true;
(2).如果两个节点有一个为空,一个不为空,返回false;
(3).如果两个节点都不为空,但是值不相等,返回false;
3.单层递归的逻辑:
(1).两个对比的节点应该是对称的,比如左树的右节点对应的需要对比的应该是右树的左节点;
代码/比较
class Solution {
public:
bool compare(TreeNode* left,TreeNode* right)//传入参数是对比的两个节点指针
{
//判断什么时候返回?
if(left==nullptr&&right!=nullptr) return false;
else if(left!=nullptr&&right==nullptr) return false;
else if(left==nullptr&&right==nullptr) return true;
else if(left->val!=right->val) return false;
//下一层递归逻辑,就是当这层对比没问题的时候往下一层继续递归
bool result1=compare(left->left,right->right);
bool result2=compare(left->right,right->left);
return result1&&result2;//都相同才为真
}
bool isSymmetric(TreeNode* root) {
return compare(root->left,root->right);
}
};
bool isSymmetric内要用 if (root == NULL) return true;防止操作空指针。
104.二叉树的最大深度
笔记:
二叉树的深度:任意一个节点到根节点的距离;
二叉树的高度:任意一个节点到叶子节点的距离;
求深度用前续遍历(中左右):因为要从根节点向下往目标节点遍历
求高度用后序遍历(左右中):因为要从叶子节点开始往上遍历
(深度往下,高度往上)。
本体为什么求的是深度还用后续遍历?因为最大深度就是根节点的高度
实操出现问题:
注意每一层递归的逻辑,取得所有子树的深度并对比取得最大深度后,在节点处返回的是深度+1值。
代码比较:
class Solution {
public:
int maxDepth(TreeNode* root) {
//返回条件:当root为空的时候返回
if(root==nullptr) return 0;//因为是null所以高度应该是0
//每一层的递归逻辑:遍历左右树,在节点处取得最大值+1
int result1=maxDepth(root->left);
int result2=maxDepth(root->right);
return max(result1,result2)+1;
}
};
559.N叉树的最大深度
代码:
class Solution {
public:
int maxDepth(Node* root) {
if(root==nullptr) return 0;
//每次递归的逻辑:就是把该节点的所有子树全部取得高度,再取得最大值。
int max=0;
for(int i=0;i<root->children.size();i++)
{
int result=maxDepth(root->children[i]);
max=(result>max)? result:max;
}
return max+1;
}
};
111.二叉树的最小深度
笔记:
仍然是求高度的逻辑。
题目的意思,最小深度指的是从根节点到一个叶子节点的最小距离。注意,不包括空节点。
所以本题在返回值的时候需要考虑子树一遍为空另一边不为空的情况。
实操出现问题:
任然是同一个问题,递归中本函数是有返回值的。
代码:
class Solution {
public:
int minDepth(TreeNode* root) {
//递归停止条件:如果遍历的节点是空,则返回0
if(root==nullptr) return 0;
//单层递归的逻辑:求得左右子树的高度;如果左右子树都不为空,在节点处返回最小值+1,如果左右子树其中一个为空,则返回不为空的子树的高度
int leftheight=minDepth(root->left);
int rightheight=minDepth(root->right);
if(root->left==nullptr&&root->right!=nullptr)
return rightheight+1;
if(root->left!=nullptr&&root->right==nullptr)
return leftheight+1;
else
{
int result=(leftheight<rightheight)?leftheight:rightheight;
return result+1;
}
}
};
1

浙公网安备 33010602011771号