654.最大二叉树
最大元素就是根节点
构造二叉树类的题目一定要用前序去构造(将中间节点构造出来 再去构造左子树和右子树)
1、确定递归函数的参数和返回值
返回二叉树的根节点
参数是存放元素的数组
返回类型是指向节点的指针
2、确定递归的终止条件
如果数组的大小为1,说明到叶子节点了,此时叶子节点就是根节点
3、单层递归逻辑
定义一个MaxValue以及对应的下标index
遍历数组,寻找比MaxValue数值还要大的值,作为二叉树的根节点
定义index的目的是,接下来分割数组的时候,要根据下标来进行分割
构造根节点,要用MaxValue来构造
加下来就是构造左子树和右子树
构造左子树的时候,保证左边至少有一个元素,因为递归函数一开始的终止条件就是有一个元素
那么怎么保证,左区间至少存在一个元素呢?if(index>0);
分割数组用的是左闭右开
右区间:[index+1,nums.size())
671.合并二叉树
前中后遍历顺序都可以,前序遍历是最容易理解的
合并必须从两个树的根节点开始
1、确定递归函数的参数及返回值
参数是合并前的两个二叉树的根节点,返回值是合并后的二叉树的根节点
2、处理终止条件
如果二叉树1的节点为空,应该返回而二叉树2对应的节点
如果二叉树2的节点为空,应该返回而二叉树1对应的节点
3、确定单层递归的逻辑
重复利用了tree1
根节点 对应相加
新的tree1的左子树=tree1左子树和tree2左子树相加
右子树与左子树处理结果一样
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {//1
//2、确定终止条件
if(root1==NULL) return root2;
if(root2==NULL ) return root1;
root1->val+=root2->val;
root1->left=mergeTrees(root1->left,root2->left);
root1->right=mergeTrees(root1->right,root2->right);
return root1;
}
};
700.二叉搜索树中的搜索
首先回顾一下什么是二叉搜索树?
二叉搜索树是一个有序树
若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值
若它的右子树不空,则右子树上所有节点的值均小于它的根节点的值
它的左、右子树也分别为二叉搜索树
在二叉树中,谈到搜索,需要考虑一下用什么方法遍历,但是在,二叉搜索树中不用考虑该情况,因为二叉搜索树本身就自带顺序
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {//1、确定递归函数的参数及返回值
//2、确定终止条件
if(root==NULL||root->val==val) return root;
TreeNode * result=NULL;
if(root->val>val) result=searchBST(root->left,val);
if(root->val<val) result=searchBST(root->right,val);
return result;
}
};
98.验证二叉搜索树
不管是判断该二叉树是不是二叉搜索树 还是遇到二叉搜索树的时候 一定要想到 中序遍历
定义一个指针 初始化该指针指向空节点 主要是用来记录前一个节点 将正在遍历的节点与前一个节点比较 若前一个节点大于当前节点 返回 false 并将pre=root
本文以上学习内容来自代码随想录