二叉排序树的构造、查找、插入及删除算法的实现(C++)

本文详细介绍了C++环境下二叉排序树的构造、查找、插入和删除算法的实现过程,包括节点类定义、核心算法实现及示例代码解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉排序树的构造、查找、插入及删除算法的实现(C++)

转自 这里

#include <iostream>
using namespace std;
class BsTree {
public:
	// 构造函数初始化树根为NULL,表示空树
	BsTree (void) : m_pRoot (NULL), m_uSize (0) {}
	// 析构函数清空树
	~BsTree (void) {
		Clear ();
	}
	// 插入数据
	void Insert (int nData) {
		Insert (new Node (nData), m_pRoot);
		m_uSize++;
	}
	// 删除数据,不存在返回false
	bool Remove (int nData) {
		Node*& pFind = Find (nData, m_pRoot);
		if (pFind) {
			Insert (pFind -> m_pLeft, pFind -> m_pRight);
			Node* pNode = pFind;
			pFind = pFind -> m_pRight;
			delete pNode;
			m_uSize--;
			return true;
		}
		return false;
	}
	// 删除所有值为nData的数据
	void RemoveAll (int nData) {
		while (Remove (nData));
	}
	// 清空树
	void Clear (void) {
		Clear (m_pRoot);
		m_uSize = 0;
	}
	// 将全部nOld改为nNew
	void Update (int nOld, int nNew) {
		while (Remove (nOld))
			Insert (nNew);
	}
	// 树中能否找到nData
	bool Find (int nData) {
		return Find (nData, m_pRoot) != NULL;
	}
	// 中序遍历
	void Travel (void) {
		cout << '{';
		Travel (m_pRoot);
		cout << '}' << endl;
	}
	// 获取树的大小
	size_t GetSize (void) {
		return m_uSize;
	}
	// 获取树的高度
	size_t GetHeight (void) {
		return GetHeight (m_pRoot);
	}
private:
	// 节点类
	class Node {
	public:
		Node (int nData) : m_nData (nData), m_pLeft (NULL), m_pRight (NULL) {}
		int m_nData; // 数据
		Node* m_pLeft; // 左树
		Node* m_pRight; // 右树
	};
	void Insert (Node* pNode, Node*& pTree) {
		if (! pTree)
			pTree = pNode;
		else if (pNode) {
			if (pNode -> m_nData<pTree -> m_nData)
				Insert (pNode, pTree -> m_pLeft);
			else
				Insert (pNode, pTree -> m_pRight);
		}
	}
	Node*& Find (int nData, Node*& pTree) {
		if (! pTree)
			return pTree;
		else
		if (nData == pTree -> m_nData)
			return pTree;
		else
		if (nData < pTree -> m_nData)
			return Find (nData, pTree -> m_pLeft);
		else
			return Find (nData, pTree -> m_pRight);
	}
	void Clear (Node*& pTree) {
		if (pTree) {
			Clear (pTree -> m_pLeft);
			Clear (pTree -> m_pRight);
			delete pTree;
			pTree = NULL;
		}
	}
	void Travel (Node*& pTree) {
		if (pTree) {
			Travel (pTree -> m_pLeft);
			cout << '<' << pTree -> m_nData << '>';
			Travel (pTree -> m_pRight);
		}
	}
	size_t GetHeight (Node*& pTree) {
		if (pTree) {
			size_t uLeft=GetHeight(pTree->m_pLeft);
			size_t uRight=GetHeight(pTree->m_pRight);
			return uLeft>uRight?uLeft+1:uRight+1;
		}
		return 0;
	}
	Node* m_pRoot; // 树根
	size_t m_uSize; // 树大小
};
int main (void) {
	//以下为测试代码 
	BsTree bt;
	bt.Insert (4);
	bt.Insert (3);
	bt.Insert (6);
	bt.Insert (9);
	bt.Travel ();
	cout << boolalpha << bt.Find (3) << endl;
	cout << boolalpha << bt.Find (100) << endl;
	bt.Remove (4);
	bt.Travel ();
	bt.Remove (3);
	bt.Travel ();
	bt.Insert (10);
	bt.Insert (20);
	bt.Insert (30);
	bt.Insert (10);
	bt.Travel ();
	bt.Update (10, 100);
	bt.Travel ();
	bt.RemoveAll (100);
	bt.Travel ();
	cout << bt.GetSize () << endl;
	cout << bt.GetHeight () << endl;
	bt.Clear ();
	bt.Travel ();
	bt.Insert (6);
	bt.Insert (2);
	bt.Insert (3);
	bt.Insert (4);
	bt.Insert (7);
	bt.Travel ();
	cout << bt.GetHeight () << endl;
	return 0;
}


描述 用函数实现如下二叉排序树算法: (1) 插入新结点 (2) 前序、中序、后序遍历二叉树 (3) 中序遍历的非递归算法 (4) 层次遍历二叉树 (5) 在二叉树查找给定关键字(函数返回值为成功1,失败0) (6) 交换各结点的左右子树 (7) 求二叉树的深度 (8) 叶子结点数 Input 第一行:准备建树的结点个数n 第二行:输入n个整数,用空格分隔 第三行:输入待查找的关键字 第四行:输入待查找的关键字 第五行:输入待插入的关键字 Output 第一行:二叉树的先序遍历序列 第二行:二叉树的中序遍历序列 第三行:二叉树的后序遍历序列 第四行:查找结果 第五行:查找结果 第六行~第八行:插入新结点后的二叉树的先、中、序遍历序列 第九行:插入新结点后的二叉树的中序遍历序列(非递归算法) 第十行:插入新结点后的二叉树的层次遍历序列 第十一行~第十三行:第一次交换各结点的左右子树后的先、中、后序遍历序列 第十四行~第十六行:第二次交换各结点的左右子树后的先、中、后序遍历序列 第十七行:二叉树的深度 第十八行:叶子结点数 Sample Input 7 40 20 60 18 50 56 90 18 35 30 Sample Output 40 20 18 60 50 56 90 18 20 40 50 56 60 90 18 20 56 50 90 60 40 1 0 40 20 18 30 60 50 56 90 18 20 30 40 50 56 60 90 18 30 20 56 50 90 60 40 18 20 30 40 50 56 60 90 40 20 60 18 30 50 90 56 40 60 90 50 56 20 30 18 90 60 56 50 40 30 20 18 90 56 50 60 30 18 20 40 40 20 18 30 60 50 56 90 18 20 30 40 50 56 60 90 18 30 20 56 50 90 60 40 4 4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值