ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

剑指offer 重建二叉树

2021-12-14 15:30:01  阅读:148  来源: 互联网

标签:preorder right 下标 offer 二叉树 重建 root 节点 left


这个题比较难理解,建议在草稿纸上自己演示一遍程序的执行过程,执行的样例可以按照这个例子
在这里插入图片描述

思路就会慢慢清晰。
规则:先根遍历:根左右。中根遍历:左根右
题目给的两个数组,先根遍历和中跟遍历,先根遍历的第一个元素就是根节点,在中根遍历中,根节点把中根遍历数组分为两部分,分别是左子树和右子树,那么左右子树又可以根据这个性质,再继续划分。整体思路就是这样。
比较难理解的地方就是,如何求出左右子树在中根遍历数组中的起始位置和终止位置。也就是代码中的recur函数的参数,
node->left = recur(root + 1, left, idx_inor[preorder[root]] - 1);
node->right = recur(root + 1 + idx_inor[preorder[root]] - left,idx_inor[preorder[root]] + 1 , right);
recur函数有3个形参,它们都是数组的下标,第一个参数是根节点在先根数组中的下标,第二个和第三个参数是左右边界在中根数组中的下标。详细的代码含义注意看代码中写的注释

/**
 * 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:
    vector<int> preorder, inorder;
    unordered_map<int, int> idx_inor;
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        this->preorder = preorder;
        this->inorder = inorder;
        int len = preorder.size();
        for (int i = 0; i < len; i ++) {
            idx_inor[inorder[i]] = i;//中序遍历用hash表存储,可以根据节点的值得到节点在中序数组中的下标
        }
        return recur(0, 0, len - 1);
    }
    TreeNode* recur(int root, int left, int right) {//三个形参都表示下标,root是根节点在preorder的下标,left和right是左右边界在inorder的下标
        if (left > right) return NULL;
        TreeNode* node = new TreeNode(preorder[root]);
        int i = idx_inor[preorder[root]];//记录根节点在中根数组中的下标
        node->left = recur(root + 1, left, i - 1);//上一根节点在先根数组的下标是root,那么根据规则,左子树的根节点下标就是root + 1,左子树的起点就是中根数组的left,终点就是上一根节点的下标i - 1(左根右)
        node->right = recur(root + 1 + i - left, i + 1 , right);//上一根节点在先根数组的下标是root,那么根据规则(根左右,左根右),右子树的根节点就是root + 左子树的节点数 + 1,就是 root + (左子树的右边界 - 左子树的左边界 + 1) + 1,即 root + (i - 1 - left + 1) + 1 = root + i -left + 1,右子树的左边界在中序数组的下标就是i + 1,右边界就是right。
        return node;
    }
};

标签:preorder,right,下标,offer,二叉树,重建,root,节点,left
来源: https://blog.csdn.net/w17390956947/article/details/121927648

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有