【 C++ 】 实现 有序二叉树 ( 左>中>右 ) binary tree 类

VBinaryTree.h

cpp 复制代码
#ifndef __V_BINARY_TREE__
#define __V_BINARY_TREE__

typedef void(*BinaryTreeMitFun)(int);

struct stBinaryTreeNode;

class VBinaryTree
{
public:
	VBinaryTree(void) { VBinaryTreeInit(); }
	~VBinaryTree(void) { VBinaryTreeDeInit(); }

	// 树的初始化
	void VBinaryTreeInit(void);
	// 树的销毁
	void VBinaryTreeDeInit(void);
	// 在树中搜寻某一结点
	VBinaryTree& VBinaryTreeSearch(int);
	// 在树中插入节点
	bool VBinaryTreeInsert(int);
	// 对树的每个节点的元素使用某种函数
	void VBinaryTreeMiter(BinaryTreeMitFun);

private:
	stBinaryTreeNode* m_pnode;
};

struct stBinaryTreeNode
{
	int val;
	VBinaryTree left;
	VBinaryTree right;
};

#endif

VBinaryTree.c

cpp 复制代码
#include "VBinaryTree.h"

void VBinaryTree::VBinaryTreeInit(void)
{
	m_pnode = NULL;
}


// 通过后续遍历节点,来销毁节点,先左节点,再右节点,最后中间节点(左右中)
void VBinaryTree::VBinaryTreeDeInit(void)
{
	// 当前节点为空直接退出
	if( !m_pnode )
	{
		return;
	}
	// 通过迭代的方式删除,先左再右最后自己
	m_pnode->left.VBinaryTreeDeInit();
	m_pnode->right.VBinaryTreeDeInit();

	delete (m_pnode);
	m_pnode = NULL;
}

// 在有序二叉树(左<中<右)中搜寻节点,通过对照val来查找
VBinaryTree& VBinaryTree::VBinaryTreeSearch(int val)
{
	// 没找到节点,进入死胡同
	if( !m_pnode )
	{
		return (VBinaryTree&)(*this);
	}

	// 当前节点是要找的节点
	if( m_pnode->val == val )
	{
		return (VBinaryTree&)(*this);
	}
	// 往左查找
	else if( m_pnode->val > val )
	{
		return m_pnode->left.VBinaryTreeSearch(val);
	}
	else
	{
		return m_pnode->right.VBinaryTreeSearch(val);
	}
}


bool VBinaryTree::VBinaryTreeInsert(int val)
{
	// 获取新插入的节点应该插入的位置
	VBinaryTree* p_tree = &(VBinaryTreeSearch(val));

	// 当节点存在时
	if( p_tree->m_pnode )
	{
		return 1;
	}
	else
	{
		p_tree->m_pnode = new stBinaryTreeNode;
		
		// 创建失败
		if( !p_tree->m_pnode )
		{
			return 1;
		}
		else
		{
			p_tree->m_pnode->val = val;
			// 给左右赋值为空,防止野指针出现
			p_tree->m_pnode->left.m_pnode = NULL;
			p_tree->m_pnode->right.m_pnode = NULL;
			
			return 0;
		}
	}
}

// 中序遍历来处理节点(左中右)
void VBinaryTree::VBinaryTreeMiter(BinaryTreeMitFun pFun)
{
	// 节点为空退出
	if( !m_pnode )
	{
		return;
	}
	
	m_pnode->left.VBinaryTreeMiter(pFun);
	pFun(m_pnode->val);
	m_pnode->right.VBinaryTreeMiter(pFun);
}

main.c

cpp 复制代码
#include "iostream"
#include "VBinaryTree.h"

using namespace std;

void myPrint(int a)
{
	cout << a << " ";
}

int main(void)
{
	VBinaryTree myTree;
	
	for( int i=0; i<10; i++ )
	{
		myTree.VBinaryTreeInsert(i);
	}
	myTree.VBinaryTreeMiter(myPrint);
	cout << "" << endl;
	
	myTree.VBinaryTreeDeInit();
	
	myTree.VBinaryTreeInsert(2);
	myTree.VBinaryTreeInsert(2321);
	myTree.VBinaryTreeInsert(-2);
	myTree.VBinaryTreeInsert(30);

	myTree.VBinaryTreeMiter(myPrint);
	cout << "" << endl;

	return 0;
}
相关推荐
MC皮蛋侠客1 小时前
C++17 多线程系列(五):C++17 并行算法——从串行到并行的零成本迁移
c++·多线程
也曾看到过繁星2 小时前
数据结构---顺序表
数据结构
meilindehuzi_a3 小时前
深入浅出数据结构:Python 字典(Dict)与集合(Set)的哈希表底层全链路追踪
数据结构·python·散列表
_日拱一卒3 小时前
LeetCode:207课程表
java·数据结构·算法·leetcode·职场和发展
郭涤生5 小时前
C++ 高性能编程最佳实践清单
开发语言·c++
.千余6 小时前
【C++】C++类与对象2:C++构造函数、运算符重载与流输入输出全面解析
c语言·开发语言·前端·c++·经验分享
郭涤生6 小时前
C++ 高性能状态机
开发语言·c++
酿情师6 小时前
Microsoft Visual C++ Build Tools 2026 下载与安装指南(Windows)
c++·windows·microsoft
cany10006 小时前
C++ -- 引用悬挂
c++
.千余7 小时前
【C++】C++类与对象3:const成员函数与取地址运算符重载,权限管理的艺术
开发语言·c++