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

这篇博客介绍了如何使用C语言实现二叉树的创建、销毁、查找指定节点、获取左右子节点以及计算树的高度。通过一个构造二叉树的示例展示了从括号表示的字符串创建二叉树的过程,并提供了相应的辅助函数进行操作。
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef char ElemType;
typedef struct node     //struct作用:一种构造数据类型,结构体   
{
   
                          
	ElemType data;      
	struct node *lchild;//指向struct node这个结构体类型
	struct node *rchild;//指向右孩子结点,左孩子结点  
}BTNode;                //声明二叉链结点类型,BT:btree二叉树,一个数据域,两个指针域
                        //typedef作用:BTNode就是struct node的别名
void CreateBTree(BTNode *&b,char *str)//构造出一个根节点的指针,构造二叉树用到的字符串 
{
   
   
	BTNode *St[MaxSize],*p;//St数组为顺序栈 
	int top=-1,k,j=0;      //top为栈顶指针
	char ch;               //ch读取str的每一个字符 
	b=NULL;                //初始时二叉链为空,b为根节点
	ch=str[j];             //取出第一个符号A
	while(ch
### 二叉树基本运算算法实现 以下是基于引用内容以及专业知识总结的二叉树基本运算算法实现方法: #### 创建二叉链存储结构 通过给定的括号表示串 `"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; } ``` 以上代码实现二叉树基本操作,包括创建、输出、查找特定节点及其孩子节点值、获取深度和销毁等功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值