实现二叉树各种基本运算的算法

本文详细介绍了一种基于括号表示法创建二叉树的方法,并实现了二叉树的各种基本运算,包括创建、输出、查找节点、计算高度及释放内存等。通过具体实例,展示了算法的完整过程和运行结果。

/**
*    实验题目:
*        实现二叉树各种基本运算的算法
*    实验目的:
*        领会二叉链存储结构和掌握二叉树中各种基本运算算法设计
*    实验内容:
        设计程序,实现二叉树的基本运算,在此基础上,完成如下功能:
*    1、由二叉树创建对应的二叉链存储结构b,该二叉树的括号表示串为
*       "A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"。
*    2、输出二叉树b
*    3、输出'H'结点的左、右孩子结点值
*    4、输出二叉树b的高度
*    5、释放二叉树b
*/

#include <stdio.h>
#include <malloc.h>

#define MAX_SIZE 100

typedef char ElemType;
typedef struct node
{
    ElemType data; // 数据元素
    struct node *lchild; // 指向左孩子结点
    struct node *rchild; // 指向右孩子结点
}BTNode; // 声明二叉链结点类型

/*-------------由括号表示串str创建二叉链b-----------------*/
static void create_btree(BTNode *&b, char *str) // 创建二叉树(形参b:指针的引用)
{
    BTNode *p;
    BTNode *St[MAX_SIZE]; // 定义一个顺序栈
    int k;
    int j = 0;
    int top = -1; // 栈顶指针初始化
    char ch;

    b = NULL; // 建立的二叉树初始时为空
    ch = str[j]; // 取第一个字符
    while(ch != '\0') // str未扫描完时循环
    {
        switch(ch)
        {
        case '(': // 开始处理左子树
            top++;
            St[top] = p;
           

### 二叉树基本运算算法实现 以下是基于引用内容以及专业知识总结的二叉树基本运算算法实现方法: #### 创建二叉链存储结构 通过给定的括号表示串 `"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"`,可以构建对应的二叉链表存储结构。此过程通常采用递归方式解析字符串并建立节点连接。 ```cpp #include <iostream> #include <cstring> using namespace std; typedef struct BTNode { char data; struct BTNode* lchild; struct BTNode* rchild; } BTNode, *BTree; // 构建二叉树函数 void CreateBTree(BTree& T, const string& str, int& index) { if (index >= str.length()) return; if (str[index] == ',') { // 跳过逗号 index++; return; } if (str[index] != '(' && str[index] != ')') { // 非括号字符即为数据部分 T = new BTNode(); T->data = str[index]; T->lchild = nullptr; T->rchild = nullptr; while (str[++index] != '(' && str[index] != ')' && str[index] != ',' && index < str.length()); --index; // 回退到当前字符 if (str[++index] == '(') { // 左子树存在 CreateBTree(T->lchild, str, ++index); if (str[++index] == ')') { // 右移跳过左括号结束符 if (str[++index] == '(') { // 判断是否有右子树 CreateBTree(T->rchild, str, ++index); if (str[++index] == ')') index++; // 如果有右子树,则继续处理后续括号 } } } } else if (str[index] == ')') { // 结束条件 index++; } } ``` #### 输出二叉树 可以通过前序遍历的方式打印整个二叉树的内容。 ```cpp void PreOrderTraversal(BTree T) { if (!T) return; cout << T->data << " "; PreOrderTraversal(T->lchild); PreOrderTraversal(T->rchild); } void PrintBinaryTree(BTree T) { if (!T) { cout << "Empty Tree"; return; } PreOrderTraversal(T); cout << endl; } ``` #### 查找指定节点的孩子节点值 对于 `'H'` 的左右孩子节点值查询,可通过递归查找目标节点,并返回其孩子的值。 ```cpp bool FindChildren(BTree T, char target, char& leftChild, char& rightChild) { if (!T) return false; if (T->data == target) { if (T->lchild) leftChild = T->lchild->data; if (T->rchild) rightChild = T->rchild->data; return true; } return FindChildren(T->lchild, target, leftChild, rightChild) || FindChildren(T->rchild, target, leftChild, rightChild); } ``` #### 计算二叉树深度 计算二叉树的最大高度(深度),可使用递归求解。 ```cpp int GetDepth(BTree T) { if (!T) return 0; int leftDepth = GetDepth(T->lchild); int rightDepth = GetDepth(T->rchild); return max(leftDepth, rightDepth) + 1; } ``` #### 销毁二叉树 释放内存资源时需注意递归调用顺序,先销毁子树再删除根节点[^3]。 ```cpp void DestroyBTree(BTree& T) { if (!T) return; DestroyBTree(T->lchild); DestroyBTree(T->rchild); delete T; T = nullptr; } ``` 以上代码实现二叉树基本操作,包括创建、输出、查找特定节点及其孩子节点值、获取深度和销毁等功能。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值