一:LeetCode 105 Construct Binary Tree from Preorder and Inorder Traversal
题目:
Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
链接:https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
分析:此题就是由二叉树的前序和中序遍历的结果构建这颗二叉树
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: void createTree(TreeNode *p, vector<int> &preorder, int pstart, int pend, vector<int> &inorder, int istart, int iend, int flag){ if(pstart > pend) return; p = new TreeNode(preorder[pstart]); if(root == NULL) root = pNode = p; else{ if(flag) pNode->right = p; // 主要是将这颗树连接起来 else pNode->left = p; pNode = p; } if(pstart == pend) return; int i = istart; for(; i <= iend; i++){ if(inorder[i] == preorder[pstart])break; } int k = i - istart; // 左子树有多少个元素 createTree(p->left, preorder, pstart+1, pstart+k, inorder, istart, i-1, 0); // 创建左子树 flag=0表示创建左子树 pNode = p; createTree(p->right, preorder, pstart+k+1, pend, inorder, i+1, iend, 1); // 创建右子树 flag=1表示创建右子树 } TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) { root = NULL; pNode = NULL; int n = preorder.size(); if(n == 0) return root; createTree(root, preorder, 0, n-1, inorder, 0, n-1, 0); return root; } private: TreeNode *root, *pNode; };
题目:
Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
链接:https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
分析:此题是由中序和后序遍历的结果构建二叉树
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: void createTree(TreeNode *p, vector<int> &inorder, int istart, int iend, vector<int> &postorder, int pstart, int pend, int flag){ if(pstart > pend) return; p = new TreeNode(postorder[pend]); if(root == NULL) root = pNode = p; else{ if(flag) pNode->right = p; // 将这颗树连接起来 else pNode->left = p; pNode = p; } if(pstart == pend) return; int i = istart; for(; i<= iend; i++){ if(inorder[i] == postorder[pend]) break; } int k = i - istart; createTree(p->left, inorder, istart, i-1, postorder, pstart, pstart+k-1, 0); // 创建左子树 pNode = p; createTree(p->right, inorder, i+1, iend, postorder, pstart+k, pend-1, 1); // 创建右子树 } TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) { root = pNode = NULL; int n = inorder.size(); if(n == 0) return root; createTree(root, inorder, 0, n-1, postorder, 0, n-1, 0); return root; } private: TreeNode *root, *pNode; };