ZBLOG

实现二叉树类的设计,要求具有的功能:1)根据二叉树括号表示法根据字符串str生成对应的二叉链存储结构b,二叉树括号表示串中只有4类字符:‘(‘、‘)’,‘,’和A-Z字母,如"A(B(D(,G)),C(E,F))",一般在构造函数中实现;2)销毁二叉链存储结构Release():销毁二叉链b并释放空间,一般在析构函数中实现;3)查找结点Find(x):在二叉树b中寻找data域值为x的结点,并返回指向该结点的指针;4)求高度Height():求二叉树b的高度;5)(选做)设置结点的其他数据...

下面是一个示例的二叉树类设计,实现了所要求的功能:

#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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=9561

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?