2.3c 由遍历序列构造二叉树

 2.3c 由遍历序列构造二叉树_哔哩哔哩_bilibili

 

105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)   106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

//C
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize) {
    if(inorderSize == 0) return NULL;
    // 创建根节点,根节点是前序遍历数组的第一个元素
    struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    root->val = preorder[0];
    // 在中序遍历数组中找到根节点的索引,索引左边即为左子树,右边为右子树
    int index;
    for(index = 0; index < inorderSize; index++){
        if(inorder[index] == root->val) break;
    }
    // 例如 preorder: O*****###, inorder: *****O###,确定边界
    root->left = buildTree(preorder+1, index, inorder, index);
    root->right = buildTree(preorder+index+1, inorderSize-index-1, inorder+index+1, inorderSize-index-1);
    return root;
}
//C++
class Solution {
private:
  unordered_map<int,int> index; //哈希映射
public:
  TreeNode* build(const vector<int>& pre,const vector<int>& in, //传入两个序列的地址
                  int pre_left,int pre_right,int in_left,int in_right){ //传入两个序列的边界
                          
    if(pre_left > pre_right) return nullptr;

    int pre_root=pre_left; // 前序遍历中的第一个节点就是根节点
    int in_root=index[pre[pre_root]]; // 在中序遍历中定位根节点位置
      
    TreeNode* root=new TreeNode(pre[pre_root]); // 先把根节点建立出来
    int size_left_tree=in_root-in_left; // 得到左子树中的节点数目
    // 例如 pre: O*****###, in: *****O###,确定边界
    root->left=build(pre,in,pre_left+1,pre_left+size_left_tree,in_left,in_root-1); //递归构造左子树,并连接到根节点
    root->right=build(pre,in,pre_left+size_left_tree+1,pre_right,in_root+1,in_right); //递归构造右子树,并连接到根节点
    return root;
  }

  TreeNode* buildTree(vector<int>& pre,vector<int>& in){ //传入两个序列的地址
    int n=pre.size();
    for(int i=0; i<n; ++i) index[in[i]]=i; //中序的第i个数字对应的下标为i,构造哈希映射,能快速定位根节点
    return build(pre,in,0,n-1,0,n-1);
  }
};

 

posted @ 2026-09-26 07:02  董晓  阅读(8)  评论(0)    收藏  举报