目录
写在前面:
题目:
题目的接口:
解题思路:
代码:
过啦!!!
写在最后:
写在前面:
今天的每日一题好难,我不会dp啊啊啊啊啊啊。
所以,我又来刷剑指 Offer 啦。
题目:剑指 Offer 07. 重建二叉树 - 力扣(Leetcode)
题目的接口:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
}
};
解题思路:
这道题不太简单啊,我得想法是:
通过前序遍历的特性找来确定根节点,
然后对应到中序遍历上,再由中序遍历通过递归的方式重建二叉树。
具体如下:
我们建一个字函数来递归,
设置下标prei 访问前序遍历数组,
使用inbegin和inend确定中序遍历的区间,
然后开展递归。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
//prei走一步少一个节点,需要传引用修改他的值
TreeNode* _buildTree(vector<int>& preorder, vector<int>& inorder,
int& prei, int inbegin, int inend)
{
//当分出来的中序区间走完(不合法),返回空指针
//证明该节点没有左/右孩子了
if(inbegin > inend)
{
return nullptr;
}
//将我们要返回的根节点new出来(毕竟要重建二叉树,当然要根节点)
TreeNode*root = new TreeNode(preorder[prei]);
//让rooti从中序区间开头开始,找出这个区间对应的根节点
int rooti = inbegin;
//遍历中序区间
while(rooti <= inend)
{
//如果找到根节点就跳出循环
if(inorder[rooti] == preorder[prei])
{
break;
}
rooti++;
}
//找到根节点后,访问前序遍历数组prei++
prei++;
//接下来就是依次根据当前的根节点,分成左右区间进行递归
//[inbegin, rooti - 1] rooti [rooti + 1, inend]
//函数的最后两个参数就是区间的头和尾了
root->left = _buildTree(preorder, inorder, prei, inbegin, rooti - 1);
root->right = _buildTree(preorder, inorder, prei, rooti + 1, inend);
//最后返回树的根
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
//设置访问前序遍历的下标,走完前序就走完整个二叉树了
int prei = 0;
//创建子函数,将中序遍历的区间传过去
return _buildTree(preorder, inorder, prei, 0, inorder.size()-1);
}
};
过啦!!!
写在最后:
以上就是本篇文章的内容了,感谢你的阅读。
如果喜欢本文的话,欢迎点赞和评论,写下你的见解。
如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。
之后我还会输出更多高质量内容,欢迎收看。