【 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;
}
相关推荐
肆忆_12 小时前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星16 小时前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛2 天前
delete又未完全delete
c++
端平入洛3 天前
auto有时不auto
c++
琢磨先生David4 天前
Day1:基础入门·两数之和(LeetCode 1)
数据结构·算法·leetcode
哇哈哈20214 天前
信号量和信号
linux·c++
多恩Stone4 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
蜡笔小马4 天前
21.Boost.Geometry disjoint、distance、envelope、equals、expand和for_each算法接口详解
c++·算法·boost
qq_454245034 天前
基于组件与行为的树状节点系统
数据结构·c#
超级大福宝4 天前
N皇后问题:经典回溯算法的一些分析
数据结构·c++·算法·leetcode