给定前序和中序序列,设计算法,构建相应二叉树
时间: 2024-01-01 16:06:04 浏览: 66
给定二叉树的前序遍历和中序遍历,可以使用递归的方法构建出相应的二叉树。
具体的实现步骤如下:
1.从前序遍历中取出第一个节点,作为根节点。
2.在中序遍历中找到根节点的位置,将中序遍历分成左子树和右子树两部分。
3.根据左子树的长度,将前序遍历也分成左子树和右子树两部分。
4.递归构建左子树和右子树。
代码如下:
```python
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def buildTree(preorder, inorder):
if not preorder or not inorder:
return None
root_val = preorder.pop(0)
root_index = inorder.index(root_val)
root = TreeNode(root_val)
root.left = buildTree(preorder, inorder[:root_index])
root.right = buildTree(preorder, inorder[root_index+1:])
return root
```
其中,preorder和inorder分别代表前序遍历和中序遍历的列表。函数返回二叉树的根节点。
相关问题
请用C++设计一个算法:基于给定二叉树的前序序列和中序序列构造二叉树并输出其括号表示串。
在C++中,我们可以利用前序遍历和中序遍历的特点来重建二叉树,然后将二叉树转换为括号表示串。首先,我们需要两个辅助函数分别用于查找根节点和递归构建子树。下面是简单的步骤:
```cpp
#include <iostream>
#include <string>
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 根据前序和中序找到根节点的位置
size_t findRoot(TreeNode* root, const vector<int>& preorder, const vector<int>& inorder) {
for (size_t i = 0; i < inorder.size(); ++i) {
if (inorder[i] == preorder[0]) {
return i;
}
}
return -1;
}
// 递归构造二叉树
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
size_t rootIndex = findRoot(NULL, preorder, inorder);
if (rootIndex == -1) return NULL;
TreeNode* root = new TreeNode(preorder[0]);
root->left = buildTree(preorder.begin() + 1, inorder.begin() + rootIndex);
root->right = buildTree(preorder.begin() + rootIndex + 1, inorder.begin() + inorder.size());
return root;
}
// 转换为括号表示串
std::string treeToString(TreeNode* root) {
if (!root) return "";
std::string leftStr = treeToString(root->left);
std::string rightStr = treeToString(root->right);
if (leftStr.length() > 0 && rightStr.length() > 0) {
return "(" + leftStr + ")(" + rightStr + ")";
} else if (leftStr.length() > 0) {
return leftStr + ")";
} else {
return "(" + rightStr + ")";
}
}
int main() {
vector<int> preorder = {1, 2, 4, 5, 3};
vector<int> inorder = {4, 2, 5, 1, 3};
TreeNode* root = buildTree(preorder, inorder);
std::cout << "Binary Tree as string: " << treeToString(root) << std::endl;
return 0;
}
```
在这个例子中,我们首先找到前序遍历的第一个元素在中序遍历中的位置作为根节点的位置,然后递归地为左子树和右子树构建二叉树。最后,通过访问每个节点的左右子树并添加相应的括号来生成括号表示串。
建立如图所示的二叉树。 (2)用递归的方法实现该二叉树的前序、中序、后序遍历。并输出遍历序列。 (3)对给定的一组键值W=(5,2,9,11,8,3,7),试设计算法构造其相应的哈夫曼树。
建立如图所示的二叉树通常需要具体的节点结构和插入操作,这里假设我们有一个简单的二叉树节点:
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
```
然后你可以通过递归的方式实现二叉树的遍历:
1. **前序遍历** (根-左-右): 对当前节点先访问,然后递归地访问左子树,最后访问右子树。
```python
def preorder_traversal(root):
if root is not None:
print(root.val) # 访问节点
preorder_traversal(root.left) # 左子树
preorder_traversal(root.right) # 右子树
```
2. **中序遍历** (左-根-右): 先递归地访问左子树,然后访问当前节点,最后访问右子树。
```python
def inorder_traversal(root):
if root is not None:
inorder_traversal(root.left) # 左子树
print(root.val) # 访问节点
inorder_traversal(root.right) # 右子树
```
3. **后序遍历** (左-右-根): 先递归地访问左子树和右子树,然后访问当前节点。
```python
def postorder_traversal(root):
if root is not None:
postorder_traversal(root.left) # 左子树
postorder_traversal(root.right) # 右子树
print(root.val) # 访问节点
```
对于给定的键值对构建哈夫曼树,可以使用贪心策略和优先队列。首先创建一个空的堆,将键值对按照权重插入堆中。然后每次从堆中取出两个最小的节点合并成一个新的节点,新节点的权重为两小节点之和,将其添加回堆中,并重复此过程直到只剩下一个节点。
```python
import heapq
def build_huffman_tree(keys_with_weights):
heap = [(weight, key) for key, weight in keys_with_weights]
while len(heap) > 1:
min_weight = heapq.heappop(heap)
second_min_weight = heapq.heappop(heap)
combined_weight = min_weight[0] + second_min_weight[0]
combined_node = (combined_weight, min_weight[1], second_min_weight[1])
heapq.heappush(heap, combined_node)
return heap[0][1:] # 返回最后一个元素,即哈夫曼树的根节点和路径信息
```
请注意,实际应用中可能需要进一步处理返回结果以形成哈夫曼编码。
阅读全文