下面是一个示例的二叉树类设计,实现了所要求的功能:
#include <iostream>
#include <stack>
using namespace std;
struct TreeNode {
char data; // 结点数据
int data2; // 结点其他数据域
TreeNode* left; // 左子结点指针
TreeNode* right; // 右子结点指针
TreeNode(char d, int d2) : data(d), data2(d2), left(nullptr), right(nullptr) {}
};
class BinaryTree {
private:
TreeNode* root; // 根结点指针
public:
BinaryTree(const string& str) {
root = nullptr;
buildTree(str);
}
~BinaryTree() {
Release();
}
void Release() {
destroy(root);
root = nullptr;
}
TreeNode* Find(char x) {
return findNode(root, x);
}
int Height() {
return getHeight(root);
}
void SetNode(char x, int y) {
setNodeData2(root, x, y);
}
void Disp() {
display(root);
cout << endl;
}
private:
// 根据括号表示法构建二叉树
TreeNode* buildTree(const string& str) {
stack<TreeNode*> s;
TreeNode* p = nullptr;
bool isLeftChild = true;
for (char c : str) {
if (c == '(') { // 左括号,创建左子结点
s.push(p);
isLeftChild = true;
} else if (c == ')') { // 右括号,回退到父结点
s.pop();
} else if (c == ',') { // 逗号,创建右子结点
isLeftChild = false;
} else {
p = new TreeNode(c, 0);
if (root == nullptr) { // 第一个结点作为根结点
root = p;
} else {
if (isLeftChild) {
s.top()->left = p; // 连接到父结点的左子结点
} else {
s.top()->right = p; // 连接到父结点的右子结点
}
}
}
}
return root;
}
void destroy(TreeNode* node) {
if (node != nullptr) {
destroy(node->left);
destroy(node->right);
delete node;
}
}
TreeNode* findNode(TreeNode* node, char x) {
if (node == nullptr || node->data == x) {
return node;
}
TreeNode* leftResult = findNode(node->left, x); // 在左子树中查找
TreeNode* rightResult = findNode(node->right, x); // 在右子树中查找
return leftResult ? leftResult : rightResult; // 返回结果(如果在左子树中找到则返回左子树结果,否则返回右子树结果)
}
int getHeight(TreeNode* node) {
if (node == nullptr) {
return 0;
}
int leftHeight = getHeight(node->left); // 左子树高度
int rightHeight = getHeight(node->right); // 右子树高度
return max(leftHeight, rightHeight) + 1; // 返回较大的子树高度加1
}
void setNodeData2(TreeNode* node, char x, int y) {
if (node != nullptr) {
if (node->data == x) { // 如果找到目标结点,设置data2值
node->data2 = y;
}
setNodeData2(node->left, x, y); // 在左子树中递归查找并设置
setNodeData2(node->right, x, y); // 在右子树中递归查找并设置
}
}
void display(TreeNode* node) {
if (node != nullptr) {
cout << "<" << node->data << "," << node->data2 << ">";
if (node->left || node->right) { // 如果有子结点,输出括号
cout << "(";
display(node->left); // 输出左子树
if (node->right) {
cout << ",";
display(node->right); // 输出右子树
}
cout << ")";
}
}
}
};
int main() {
string str = "A(B(D(,G)),C(E,F))";
BinaryTree tree(str);
tree.Disp();
TreeNode* foundNode = tree.Find('D');
if (foundNode != nullptr)
cout << "Found Node: <" << foundNode->data << "," << foundNode->data2 << ">" << endl;
int height = tree.Height();
cout << "Tree Height: " << height << endl;
tree.SetNode('B', 10);
tree.Disp();
return 0;
}
这个示例中实现了二叉树类,可以根据括号表示法的字符串构建二叉树,支持销毁二叉链存储结构、查找结点、求高度、设置其他数据域以及输出二叉树等功能。在括号表示法中,左括号’(‘表示创建左子结点,右括号’)‘表示回退到父结点,逗号’,‘表示创建右子结点。
内容由零声教学AI助手提供,问题来源于学员提问