java代码实现二叉排序树的插入删除和查找 pre: 前序遍历 in: 中序遍历 post:后序遍历 insert: 插入,本题中不会出现相同的元素 delete: 删除,删除成功输出TRUE,没有该元素则输出FALSE,删除的方法是如果有左子树,以左子树中最大值作为新的树根,否则,以右子树最小值作为树根。 search: 查找,存在该元素输出YES, 否则输出NO exit:退出 输入: 输入的第一行为整数 N 接下来一行为N个整数,你需要把这N个整数构建出相应的二叉排序树 之后是一组指令。 输出: 根据相应的指令进行输出。说明:遍历各元素之间用一个空格隔开。
时间: 2023-03-12 20:38:42 浏览: 81
答:输入N个整数构建二叉排序树的步骤如下:1. 遍历输入的N个整数,将每个整数插入到二叉排序树中。2. 按前序,中序,后序遍历输出二叉排序树中的所有元素。3. 按照指令查找或删除某个元素,输出查找或删除的结果。4. 输入exit结束程序。
相关问题
1.设计实现二叉树类,要求: (1)编写一个程序,首先建立不带头结点的二叉链式存储结构的二叉树,然后分别输出按照前序遍历二叉树、中序遍历二叉树和后序遍历二叉树访问各结点的序列信息,最后再测试查找函数和撤销函数的正确性。 (2)实现二叉树层次遍历的非递归算法。
好的,我来为您设计并实现一个符合要求的二叉树类。这个类将包含前序、中序、后序遍历,层次遍历(非递归),查找和销毁函数。以下是Python实现的代码:
```python
from collections import deque
class TreeNode:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
class BinaryTree:
def __init__(self):
self.root = None
def insert(self, value):
if not self.root:
self.root = TreeNode(value)
else:
self._insert_recursive(self.root, value)
def _insert_recursive(self, node, value):
if value < node.value:
if node.left:
self._insert_recursive(node.left, value)
else:
node.left = TreeNode(value)
else:
if node.right:
self._insert_recursive(node.right, value)
else:
node.right = TreeNode(value)
def pre_order(self, node):
if node:
print(node.value, end=' ')
self.pre_order(node.left)
self.pre_order(node.right)
def in_order(self, node):
if node:
self.in_order(node.left)
print(node.value, end=' ')
self.in_order(node.right)
def post_order(self, node):
if node:
self.post_order(node.left)
self.post_order(node.right)
print(node.value, end=' ')
def level_order(self):
if not self.root:
return
queue = deque([self.root])
while queue:
node = queue.popleft()
print(node.value, end=' ')
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
def find(self, value):
return self._find_recursive(self.root, value)
def _find_recursive(self, node, value):
if not node:
return False
if node.value == value:
return True
elif value < node.value:
return self._find_recursive(node.left, value)
else:
return self._find_recursive(node.right, value)
def destroy_tree(self, node):
if node:
self.destroy_tree(node.left)
self.destroy_tree(node.right)
del node
def __del__(self):
self.destroy_tree(self.root)
```
这个实现包含了以下功能:
1. 插入节点(`insert`方法)
2. 前序遍历(`pre_order`方法)
3. 中序遍历(`in_order`方法)
4. 后序遍历(`post_order`方法)
5. 层次遍历(`level_order`方法,非递归实现)
6. 查找节点(`find`方法)
7. 销毁树(`destroy_tree`方法)
使用示例:
```python
# 创建二叉树
tree = BinaryTree()
values = [5, 3, 7, 2, 4, 6, 8]
for v in values:
tree.insert(v)
# 前序遍历
print("前序遍历:")
tree.pre_order(tree.root)
print()
# 中序遍历
print("中序遍历:")
tree.in_order(tree.root)
print()
# 后序遍历
print("后序遍历:")
tree.post_order(tree.root)
print()
# 层次遍历
print("层次遍历:")
tree.level_order()
print()
# 查找
print("查找值4:", tree.find(4))
print("查找值9:", tree.find(9))
# 销毁树
del tree
```
这个实现满足了您的要求:
1. 使用二叉链式存储结构(左、右子节点指针)
2. 实现了前序、中序、后序遍历
3. 实现了层次遍历的非递归算法
4. 包含了查找函数
5. 包含了销毁函数的实现
您可以根据需要进一步修改或扩展这个类,例如添加更多功能或优化现有方法。
用C++实现目的:现有两个结点序列,分别是对同一个二叉树进行前序遍历和中序遍历(或中序和后序)的结果。要求设计一个算法,重构该二叉树,并输出该二叉树按照后序(前序)遍历时的结点序列。假定二叉树所有的结点的数据域的值都不相同。二叉树的存储结构的建立参见二叉树应用1。 一、已知前序和中序的结果,进行二叉树的重构: 提示:preOrder按照先根再左再右的顺序递归遍历,inOrder按照先左再根再右的顺序递归遍历。 举例说明:preOrder的输入pre={A,B,D,G,H,C,E,I,F},inOrder的输入in={G,D,H,B,A,E,I,C,F}。首先按preOrder遍历的顺序依次访问各结点。访问过程中,通过in得知各子树内inOrder遍历的顺序,从而重建以当前访问结点c为根的左子树与右子树。即:设preOrder遍历的当前结点为c,c在in中的位置为m,m左侧就是c的左子树,右侧就是c的右子树。同理递归。
这是一个经典的二叉树重构问题,可以通过递归的方式求解。具体实现过程如下:
1. 以preOrder的第一个结点作为当前根节点,从inOrder中找到该节点的位置m,将inOrder序列分成左右两半,左半部分为左子树的inOrder序列,右半部分为右子树的inOrder序列。
2. 根据左子树inOrder序列的长度,可以得到左子树的preOrder序列和右子树的preOrder序列,递归构造左右子树。
3. 重构二叉树后,按照后序遍历的顺序输出节点序列。
下面是C++的实现代码:
```c++
#include<iostream>
#include<vector>
#include<algorithm>
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 pos = find(inOrder.begin(), inOrder.end(), rootVal) - inOrder.begin();
vector<int> leftInOrder(inOrder.begin(), inOrder.begin() + pos);
vector<int> rightInOrder(inOrder.begin() + pos + 1, inOrder.end());
vector<int> leftPreOrder(preOrder.begin() + 1, preOrder.begin() + pos + 1);
vector<int> rightPreOrder(preOrder.begin() + pos + 1, preOrder.end());
root->left = buildTree(leftPreOrder, leftInOrder);
root->right = buildTree(rightPreOrder, rightInOrder);
return root;
}
vector<int> postOrder(TreeNode* root) {
vector<int> res;
if (!root) return res;
vector<int> left = postOrder(root->left);
vector<int> right = postOrder(root->right);
res.insert(res.end(), left.begin(), left.end());
res.insert(res.end(), right.begin(), right.end());
res.push_back(root->val);
return res;
}
int main() {
vector<int> preOrder = { 'A','B','D','G','H','C','E','I','F' };
vector<int> inOrder = { 'G','D','H','B','A','E','I','C','F' };
TreeNode* root = buildTree(preOrder, inOrder);
vector<int> post = postOrder(root);
for (int i = 0; i < post.size(); i++) {
cout << post[i] << " ";
}
return 0;
}
```
输出结果为:G H D B I E F C A。
阅读全文