1.树相关的问题一般都是可以使用递归进行求解的,同时记住一个思路就是首先是明确当前根节点需要做什么,然后依次递归去左右子树做什么即可!一定要明白的是当前根节点做什么也等同于当前只有一个节点之后的时候!
2.一般题目中可能有两种类型,一种是单纯的遍历其中的树节点去完成一些操作,另外一种是去修改对应树的结构,则一般是直接在原先的树的基础上进行修改。然后返回这样的时候就需要明白当前的一些修改细节和对应操作!但是总的思想不改变。
3.一些题目的问题中对应的可能是单个指针没法完成问题的处理的,是需要加入另外的指针进行处理,将函数的操作变成两个指针一起,然后同时来完成处理,使用双指针的方式来完成处理。
4.无论是直接遍历问题还是需要创建一颗新的二叉树的问题,首先都是明确当前的根节点需要做什么,然后再次去完成创建与遍历操作,创建根节点之后,那么就应该递归的去创建根节点的左子树和右子树,遍历树的时候当遍历对应的根节点后完成了对应的操作之后就应该明白直接去继续遍历对应的左右子树即可!
5.重构一棵树的时候,首先是完成对应的根节点的创建,创建之后然后再次创建左右子树!逻辑上也是类似于对应的树的遍历方式
二叉树的一些题目解法总结!在二叉树的时候最重要的是完成对应的框架的总结,我还是比较蠢,到处结合学习,不断学习还是停留在不入门阶段,想通过这些来大概总结一下,不知道是否可以完成一定的提高!
leetcode:226 翻转二叉树
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root == NULL) return NULL;
TreeNode *cur = root->left;
root->left = root->right;
root->right = cur ;
invertTree(root -> left);
invertTree(root -> right);
return root;
}
};
首先完成当前节点的左右节点的交换,然后递归交换对应的左右节点的子树的节点即可。就是等同于先序遍历的方式实现的。
另外的一些题目中对应的层次遍历的方式是非常好用的,实现的时候是可以很好的解决问题的,在实现的时候需要把握好是否可以使用层次遍历完成解决问题。
对称二叉树的实现:
题目大意为:
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root) return true;
return ans(root->left,root->right);
}
bool ans(TreeNode* t1, TreeNode *t2)
{
if(t1 == NULL && t2 == NULL) return true;
if(t1 == NULL || t2 == NULL) return false;
return (t1->val == t2->val) && ans(t1->left, t2->right) && ans(t1->right, t2->left);
}
解决方法:首先判断当前节点是否满足对应的堆成性质,如果满足那么当前传入的两个节点必须要么同时为 NULL , 要么同时都不是 NULL 的性质,然后递归求解后续的节点是否满足,然后就必须要求当前的节点的值相同的,而且对应的左右子树的也是相等的才可以。
- 二叉树的操作的时候还需要首先比较一下是优先操作节点本身还是要优先操作叶子节点!
- 二叉树的比较的时候一些有当前节点的性质满足的同时也要求对应的左右子树满足的时候则需要对应的节点全部都满足的,实现的代码即可二使用如下的方式完成:
return A->val == B -> val && dfs(A->left, B->left) && dfs(A->right, B->right);
- 还有就是看看是否有对应的子树修改的时候需要对应的返回不一样的结果的时候,当需要对于原本的子树进行修改的时候则需要直接对于其中的root的指针进行修改!
1325 删除等于给定值的叶子节点