二叉查詢樹的實現——C++
二叉查詢樹是比較基礎的資料結構,可實現排序、二分查詢等操作。
但是由於生成方式的侷限性(不控制平衡),當先後插入的關鍵字有序時,便會形成單支,嚴重影響效率和效能。(後續要實現的目標當然就是自平衡樹了,比如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===================================
相關文章
- 二叉查詢樹概念及實現
- JavaScript實現簡單二叉查詢樹JavaScript
- 第 34 題:如何實現二叉查詢樹?
- 二叉查詢樹
- 二叉查詢樹的插入刪除查詢
- 使用JS去實現一個BST(二叉查詢樹)JS
- 手擼二叉樹——二叉查詢樹二叉樹
- 實現二叉搜尋樹的新增,查詢和刪除(JAVA)Java
- 最優二叉查詢樹—動態規劃C++動態規劃C++
- 詳細二叉樹實現c++二叉樹C++
- 二叉查詢樹【二叉排序樹】構建和查詢演算法 PHP 版排序演算法PHP
- 平衡二叉查詢樹:紅黑樹
- Python實現二叉樹的增、刪、查Python二叉樹
- 折半查詢(C++實現)C++
- 二叉樹路徑查詢二叉樹
- Amazing tree —— 二叉查詢樹
- 二叉查詢樹和笛卡爾樹
- 用Python實現二叉樹的增、刪、查Python二叉樹
- 二叉查詢樹(查詢、插入、刪除)——C語言C語言
- 5分鐘瞭解二叉樹之二叉查詢樹二叉樹
- 滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹(二叉查詢樹)和最優二叉樹二叉樹
- c++字串查詢函式實現C++字串函式
- 二叉樹實現二叉樹
- 【Algorithm&DataStructure】二叉查詢樹(BST)的遍歷GoASTStruct
- Java實現遞迴查詢樹結構Java遞迴
- 霍夫曼樹(最優二叉樹)的實現二叉樹
- MySQL實現樹狀所有子節點查詢的方法MySql
- 二叉樹的遍歷實現二叉樹
- C++樹——遍歷二叉樹C++二叉樹
- Kotlin 鏈式儲存的二叉樹中查詢節點Kotlin二叉樹
- JZ-062-二叉查詢樹的第 K 個結點
- C/C++ 二叉樹C++二叉樹
- js實現完全排序二叉樹、二叉搜尋樹JS排序二叉樹
- 二叉搜尋樹的python實現Python
- Java實現紅黑樹(平衡二叉樹)Java二叉樹
- JavaScript 二叉搜尋樹以及實現翻轉二叉樹JavaScript二叉樹
- Python 樹表查詢_千樹萬樹梨花開,忽如一夜春風來(二叉排序樹、平衡二叉樹)Python排序二叉樹
- [譯] GopherCon 2018:揭祕二叉查詢樹演算法Go演算法
- 資料結構與演算法-二叉查詢樹資料結構演算法