给出一棵二叉树的前序遍历 (preorder) 和中序遍历 (inorder),用代码实现它的后序遍历 (postorder)
时间: 2024-05-14 14:13:10 浏览: 129
好的,下面是代码实现:
```
def postorder(preorder, inorder):
if not preorder:
return []
root = preorder[0]
i = inorder.index(root)
left = postorder(preorder[1:i+1], inorder[:i])
right = postorder(preorder[i+1:], inorder[i+1:])
return left + right + [root]
preorder = [1, 2, 4, 5, 3, 6, 7]
inorder = [4, 2, 5, 1, 6, 3, 7]
print(postorder(preorder, inorder))
```
输出结果为:[4, 5, 2, 6, 7, 3, 1]
请问还有哪些问题需要我回答呢?
相关问题
给出一棵二叉树的前序遍历 (preorder) 和中序遍历 (inorder),求它的后序遍历 (postorder)。
好的,这个问题可以通过递归的方式来解决。首先我们可以找到根据前序遍历得到的二叉树的根节点,然后在中序遍历中找到该节点的位置,然后可以得到该节点的左子树和右子树的中序遍历序列。由于前序遍历的第二个节点一定就是根的左孩子或右孩子,所以可以根据该节点在前序遍历序列中的位置,得到该节点的左子树和右子树的前序遍历序列。然后就可以递归地求解左子树和右子树的后序遍历序列,并将根节点插入到后序遍历序列的最后面,得到整个二叉树的后序遍历序列。
代码实现可以参考以下代码:
```python
def buildTree(preorder, inorder):
if not preorder:
return None
root = TreeNode(preorder[0])
index = inorder.index(root.val)
root.left = buildTree(preorder[1:index+1], inorder[:index])
root.right = buildTree(preorder[index+1:], inorder[index+1:])
return root
def postorderTraversal(root):
res = []
def dfs(node):
if not node:
return
dfs(node.left)
dfs(node.right)
res.append(node.val)
dfs(root)
return res
preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]
root = buildTree(preorder, inorder)
postorder = postorderTraversal(root)
print(postorder) # [9, 15, 7, 20, 3]
```
请用C++实现:给出一棵二叉树的前序遍历 (preorder) 和中序遍历 (inorder),求它的后序遍历 (postorder)。
这道题可以用递归的方式解决,具体实现如下:
```c++
#include <iostream>
#include <vector>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if (preorder.empty() || inorder.empty()) {
return NULL;
}
int rootVal = preorder[0];
TreeNode* root = new TreeNode(rootVal);
int rootIndex = 0;
for (int i = 0; i < inorder.size(); i++) {
if (inorder[i] == rootVal) {
rootIndex = i;
break;
}
}
vector<int> leftPreorder(preorder.begin() + 1, preorder.begin() + rootIndex + 1);
vector<int> rightPreorder(preorder.begin() + rootIndex + 1, preorder.end());
vector<int> leftInorder(inorder.begin(), inorder.begin() + rootIndex);
vector<int> rightInorder(inorder.begin() + rootIndex + 1, inorder.end());
root->left = buildTree(leftPreorder, leftInorder);
root->right = buildTree(rightPreorder, rightInorder);
return root;
}
void postorderTraversal(TreeNode* root, vector<int>& postorder) {
if (root == NULL) {
return;
}
postorderTraversal(root->left, postorder);
postorderTraversal(root->right, postorder);
postorder.push_back(root->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> postorder;
postorderTraversal(root, postorder);
return postorder;
}
int main() {
vector<int> preorder = { 1,2,4,5,3,6 };
vector<int> inorder = { 4,2,5,1,3,6 };
TreeNode* root = buildTree(preorder, inorder);
vector<int> postorder = postorderTraversal(root);
for (int i = 0; i < postorder.size(); i++) {
cout << postorder[i] << " ";
}
cout << endl;
return 0;
}
```
其中,`buildTree` 函数用来构建二叉树,`postorderTraversal` 函数用来进行后序遍历。具体思路是先找到前序遍历序列中的根节点,然后在中序遍历序列中找到根节点的位置,根节点左边的部分就是左子树的中序遍历序列,根节点右边的部分就是右子树的中序遍历序列。然后根据左右子树的中序遍历序列长度可以在前序遍历序列中分离出左右子树的前序遍历序列。然后递归构建左右子树即可。最后进行后序遍历即可得到答案。
阅读全文