二叉树的构造

struct Node{
    char data;
    Node* right, *left;
};
class Bitree{
public:
    Bitree(){
        root = new Node();
        root->left = nullptr;
        root->right = nullptr;
    }
    void CreateBitree(string &s){
        int pos = -1;
        root = Create(s,pos);
    }
    Node* Create(string &s, int &pos){// 注意这里的pos一定要写成引用,否则不能保证pos的累加
        pos++;
        Node* node ;
        if(pos > s.size()) return nullptr;
        else  if(s[pos] == '#') node = nullptr;
        else{
            node = new Node();
            node->data = s[pos];
            node->left = Create(s, pos);
            node->right = Create(s, pos);
        }
        return node;
    }
    
    void preorder(Node* p){
        if(!p) return;
        cout<< p->data<<endl;
        preorder(p->left);
        preorder(p->right);
    }
    Node* root;
};


int main(){
    string s = "ABD##E#F##C##";
    Bitree t;
    t.CreateBitree(s); //通过先序遍历的顺序构造二叉树
    t.preorder(t.root);
    return 0;

}

 

### C++ 中实现二叉树构造算法 在 C++ 编程语言中,构建二叉树是一个常见的任务。可以通过不同的方式来创建一棵二叉树,比如基于先序遍历输入的方式或者通过表达式解析等方式。 #### 方法一:基于先序遍历的二叉树构建 一种常见且简单的方法是使用先序遍历来构建二叉树。这种方法假设用户按照根节点、左子树、右子树的顺序依次输入节点值,并用特定标记(如 `-1`)表示空节点。下面提供了一个具体的实现: ```cpp #include <iostream> using namespace std; // 定义二叉树节点结构 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; // 创建二叉树函数 TreeNode* createTree() { int value; cin >> value; // 输入当前节点的值 if (value == -1) { // 如果遇到特殊标志,则返回空指针 return nullptr; } TreeNode* root = new TreeNode(value); // 创建新节点 root->left = createTree(); // 递归创建左子树 root->right = createTree(); // 递归创建右子树 return root; // 返回当前节点作为父节点的孩子 } ``` 上述代码展示了如何通过递归调用来完成二叉树的构建过程[^2]。 --- #### 方法二:利用随机策略优化二叉树操作效率 为了进一步提升二叉树的操作性能,在某些场景下可以引入随机化技术。例如,Treap 是一种结合了堆性质和平衡二叉查找树特性的数据结构,其核心在于为每个节点分配一个优先级并保持堆属性的同时维护键值有序性。这种设计使得插入、删除等操作的时间复杂度接近 O(log n),从而提高了整体效率[^3]。 以下是简单的 Treap 节点定义以及旋转操作的基础框架: ```cpp #include <cstdlib> // 需要用于 rand() #include <climits> class TreapNode { public: int key, priority; TreapNode *left, *right; TreapNode(int k) : key(k), priority(rand()), left(NULL), right(NULL) {} // 初始化时设置随机优先级 }; ``` 注意这里的 `priority` 字段由标准库中的 `<random>` 或者传统 `rand()` 函数生成,具体取决于实际应用场景的需求。 --- #### 表达式树的具体实例 除了普通的数值型二叉树外,还有一种叫做 **表达式树** 的变体形式特别适用于处理算术表达式的存储与计算。在这种情况下,叶子结点保存的是操作数(Operands),而非叶结点则对应于各种运算符(Operators)[^5]。 举个例子来说,“a+b*c-d/e”的相应表达式树如下所示: ``` - / \ + / / \ / \ a * d e / \ b c ``` 对应的程序片段可能看起来像这样: ```cpp enum class NodeType { OPERATOR, VALUE }; struct ExprTreeNode { union ValueUnion { char op; // 当类型为OPERATOR时有效 double number; // 当类型为VALUE时有效 }; NodeType type; ExprTreeNode* left; ExprTreeNode* right; ExprTreeNode(char o): type(NodeType::OPERATOR), left(nullptr), right(nullptr){ this->ValueUnion.op = o; } ExprTreeNode(double num):type(NodeType::VALUE), left(nullptr), right(nullptr){ this->ValueUnion.number=num; } }; ``` 此部分主要讨论了不同类型的二叉树及其适用范围,包括常规整数序列构成的标准二叉树以及专门针对代数公式的表达式树两种情况][^[^45]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值