【 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;
}
相关推荐
zjun100131 分钟前
C++:单例模式
c++·单例模式
同勉共进9 小时前
记一例 vibe coding + gcc bug 导致的线程池死锁问题
c++·线程池·gcc·死锁·vibe coding
我叫洋洋9 小时前
C ++ [ hello world ]
c语言·c++·算法
奋发向前wcx11 小时前
y1,y2总复习笔记5 2026.7.19
数据结构·笔记·算法
王维同学13 小时前
[自学][Windows C++]RunOnceEx 注册表分组键的安全遍历
c++·windows·安全·开源
Scott9999HH14 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法
脱胎换骨-军哥15 小时前
C++/Rust无缝互操作:混合系统新常态
开发语言·c++·rust
ChaoZiLL15 小时前
我的数据结构4-栈和队列
数据结构
miller-tsunami16 小时前
顺序表相关知识点
数据结构·顺序表
旖-旎16 小时前
LeetCode 279:完全平方数(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题