二叉查找树的实现——C++
2013-02-19 23:23
375 查看
二叉查找树是比较基础的数据结构,可实现排序、二分查找等操作。
但是由于生成方式的局限性(不控制平衡),当先后插入的关键字有序时,便会形成单支,严重影响效率和性能。(后续要实现的目标当然就是自平衡树了,比如AVL、红黑树)
话不多说,直接贴源码。
头文件(BinarySearchTree.h):
实现文件(BinarySearchTree.cpp):
测试文件(TestBST.cpp)
运行结果:
=============================End===================================
但是由于生成方式的局限性(不控制平衡),当先后插入的关键字有序时,便会形成单支,严重影响效率和性能。(后续要实现的目标当然就是自平衡树了,比如AVL、红黑树)
话不多说,直接贴源码。
头文件(BinarySearchTree.h):
/*********************** * BinarySearchTree.h **********************/ #pragma once //节点定义. typedef struct _BinaryTreeNode { int data; struct _BinaryTreeNode *leftChild, *rightChild; }BinaryTreeNode; //二叉查找树类. class BinarySearchTree { private: BinaryTreeNode* m_pRootNode; //根节点 public: BinarySearchTree(); ~BinarySearchTree(); //添加节点. bool AddNode(int data = 0); //前序遍历. void PreOrderTraverse(); //中序遍历. void InOrderTraverse(); //后序遍历. void PostOrderTraverse(); private: //插入节点,递归. void InsertNode(BinaryTreeNode* toNode, BinaryTreeNode* srcNode); //递归实现前序遍历. void PreOrder(BinaryTreeNode* node); //递归实现中序遍历. void InOrder(BinaryTreeNode* node); //递归实现后序遍历. void PostOrder(BinaryTreeNode* node); //打印节点. void PrintNode(BinaryTreeNode* node); //创建新节点. BinaryTreeNode* CreateNewNode(int data); //删除所有节点,在析构函数中调用. void DeleteAllNodes(); //递归删除节点. void DeleteNode(BinaryTreeNode* node); };
实现文件(BinarySearchTree.cpp):
/** * BinarySearchTree.cpp */ #include "BinarySearchTree.h" #include <stdio.h> BinarySearchTree::BinarySearchTree() :m_pRootNode(NULL) { } BinarySearchTree::~BinarySearchTree() { this->DeleteAllNodes(); } bool BinarySearchTree::AddNode(int data/* = 0*/) { BinaryTreeNode* newNode = this->CreateNewNode(data); if(!newNode) return false; if(!m_pRootNode) { m_pRootNode = newNode; return true; } this->InsertNode(m_pRootNode, newNode); return true; } void BinarySearchTree::InsertNode(BinaryTreeNode* toNode, BinaryTreeNode* srcNode) { if(!toNode || !srcNode) return; if(srcNode->data <= toNode->data) { if(!toNode->leftChild) { toNode->leftChild = srcNode; } else { this->InsertNode(toNode->leftChild, srcNode); } } else { if(!toNode->rightChild) { toNode->rightChild = srcNode; } else { this->InsertNode(toNode->rightChild, srcNode); } } } void BinarySearchTree::PreOrderTraverse() { this->PreOrder(m_pRootNode); } void BinarySearchTree::PreOrder(BinaryTreeNode* node) { if(!node) { return; } this->PreOrder(node->leftChild); this->PrintNode(node); this->PreOrder(node->rightChild); } void BinarySearchTree::InOrderTraverse() { this->InOrder(m_pRootNode); } void BinarySearchTree::InOrder(BinaryTreeNode* node) { if(!node) return; this->PrintNode(node); this->InOrder(node->leftChild); this->InOrder(node->rightChild); } void BinarySearchTree::PostOrderTraverse() { this->PostOrder(m_pRootNode); } void BinarySearchTree::PostOrder(BinaryTreeNode* node) { if(!node) return; this->PostOrder(node->rightChild); this->PrintNode(node); this->PostOrder(node->leftChild); } BinaryTreeNode* BinarySearchTree::CreateNewNode(int data/* = 0*/) { BinaryTreeNode* newNode = new BinaryTreeNode(); if(newNode) newNode->data = data; return newNode; } void BinarySearchTree::PrintNode(BinaryTreeNode* node) { if(!node) return; printf("%d ", node->data); } void BinarySearchTree::DeleteAllNodes() { this->DeleteNode(m_pRootNode); } void BinarySearchTree::DeleteNode(BinaryTreeNode* node) { if(!node) return; //自底向上. this->DeleteNode(node->leftChild); this->DeleteNode(node->rightChild); delete node; }
测试文件(TestBST.cpp)
/** * TestBST.cpp */ #include "BinarySearchTree.h" #include <iostream> #include <time.h> using namespace std; bool testBST(int nodeNum) { BinarySearchTree* pBST = new BinarySearchTree(); //以当前时间为随机种子. srand((unsigned int)time(0)); //添加指定个数的元素. cout<<"Insert: "<<endl; int tmpData; for(int i =0; i<nodeNum; ++i) { tmpData = rand(); cout<<tmpData<<' '; if(!pBST->AddNode(tmpData)) { return false; } } //遍历. cout<<endl<<endl<<"PreOrder: "<<endl; pBST->PreOrderTraverse(); cout<<endl<<endl<<"InOrder:"<<endl; pBST->InOrderTraverse(); cout<<endl<<endl<<"PostOrder:"<<endl; pBST->PostOrderTraverse(); //清理. delete pBST; return true; } int main() { if(!testBST(10)) { //cout<<endl<<"测试失败."<<endl; } return 0; }
运行结果:
=============================End===================================
相关文章推荐
- 二叉查找树C++实现
- 二叉查找树 C++实现(含完整代码)
- C++模板实现二叉查找树(一 树的数据结构定义与节点插入)
- 二叉查找树解析及其C++实现
- C++模板实现二叉查找树(三 深度优先遍历)
- 二叉查找树 C++实现
- C++模板实现二叉查找树(一 树的数据结构定义与节点插入)
- 最优二叉查找树的详细分析,c++代码实现
- 算法导论中十二章C++实现二叉查找树建立,插入,删除,遍历操作
- 问题六十四:怎么用C++实现二叉查找树(binary search tree)及其相关操作
- 算法导论第十二章——二叉查找树的C++代码实现
- 二叉查找树(二)之 C++的实现
- 二叉查找树 C++实现(含完整代码)
- 二叉查找树的插入、删除、遍历和查找等C++实现
- 二叉查找树的简单C++实现
- 二叉查找树(二叉排序树)操作大全C++实现
- C++模板实现二叉查找树(三 深度优先遍历)
- 最优二叉查找树-optimal-BST--C++实现2
- 最优二叉查找树-optimal-BST--C++实现
- 算法练习之二叉查找树 C++实现