构造二叉树 发表于 2022-03-16 | 分类于 数据结构 , 二叉树 , 构造二叉树 | 本文分别介绍了通过二叉树的前序和中序遍历结果构造二叉树以及通过二叉树的中序和后序遍历结果构造二叉树。 定义二叉树结构123456789// Definition for a binary tree node.struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}}; 从前序与中序遍历序列构造二叉树123456789101112131415161718192021222324252627282930313233class Solution {public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { return build(preorder, 0, preorder.size()-1, inorder, 0, inorder.size()-1); } TreeNode* build(vector<int> preorder, int preStart, int preEnd, vector<int> inorder, int inStart, int inEnd){ // base case; if(preStart>preEnd){ return nullptr; } //root节点对应的值就是前序遍历数组的第一个元素; int rootVal = preorder[preStart]; //rootVal在中序遍历数组中的索引; int index = 0; for(int i=inStart;i<=inEnd;i++){ if(inorder[i] == rootVal){ index=i; break; } } int size = index-inStart; //先构造出当前根节点; TreeNode* root = new TreeNode(rootVal); //递归构造左右子树; root->left = build(preorder,preStart+1, preStart+size, inorder,inStart,index-1); root->right = build(preorder, preStart+size+1, preEnd, inorder,index+1,inEnd); return root; }}; 从后序与中序遍历序列构造二叉树123456789101112131415161718192021222324252627282930313233class Solution {public: TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { return build(inorder, 0, inorder.size()-1, postorder, 0, postorder.size()-1); } TreeNode* build(vector<int> inorder, int inStart, int inEnd, vector<int> postorder, int postStart, int postEnd){ // base case; if(postStart>postEnd){ return nullptr; } //root节点对应的值就是后序遍历数组的最后一个元素; int rootVal = postorder[postEnd]; //rootVal在中序遍历数组中的索引; int index = 0; for(int i=inStart; i<=inEnd; i++){ if(inorder[i]==rootVal){ index = i; break; } } int size = index-inStart; //先构造出当前根节点; TreeNode* root = new TreeNode(rootVal); //递归构造左右子树; root->left = build(inorder, inStart, index-1, postorder, postStart, postStart+size-1); root->right = build(inorder, index+1, inEnd, postorder, postStart+size, postEnd-1); return root; }}; -------------本文结束 感谢阅读------------- 本文作者: HReina 本文链接: http://hreina.com/2022/03/16/%E6%9E%84%E9%80%A0%E4%BA%8C%E5%8F%89%E6%A0%91/ 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!