今日刷题,538. 把二叉搜索树转换为累加树。明确知道利用二叉搜索树中序遍历的情况下是有序数组这一个特点,进行“逆中序”来累加。但是在递归时却还是有些没有搞清楚一些细节,终究还是没有掌握。
问题主要还是在于递归返回值的处理上:
在中序遍历的情况下,似乎对于左右两个节点的遍历,不太方便进行返回值的操作,因为中序在中间,若后面有返回值,那么处理逻辑又在哪呢,还有前序遍历似乎也是一样,逻辑处理已经在最前面进行了,那么你的后面的递归有返回值又该怎么去处理呢?但是也有一种情况,只是因为刷题过程中不想重新设计一个递归函数,如:
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == NULL) return root;
swap(root->left, root->right); // 中
invertTree(root->left); // 左
invertTree(root->right); // 右
return root;
}
};
// 这里是虽然有返回值但是实际上递归过程中是没有值来承接的。
// 实际上仍然可以看作没有返回值:
class Solution {
public:
void invert(TreeNode* root) {
if (root == nullptr) return;
swap(root->left, root->right);
invertTree(root->left);
invertTree(root->right);
}
TreeNode* invertTree(TreeNode* root) {
if (root == nullptr) return root;
invert(root);
return root;
}
};
上述类型的题目不涉及修改二叉树的结构,只是涉及到正常的变换,所以没必要涉及返回值去承接什么,只是在递归过程中完成逻辑处理
还有一种情况是,需要构造,修改:
这种root->left和root->roght都需要承接逻辑处理之后产生的新的结构,所以是肯定需要返回值的,而且大概率还是这种:
root->left = 递归(root->left, ...);
root->right = 递归(root->right, ...);
> 以上只是我个人浅薄记录,欢迎批评指正。
标签:遍历,递归,invertTree,right,三种,二叉树,返回值,root,left
From: https://www.cnblogs.com/H-force/p/17802426.html