设为首页 加入收藏

TOP

二叉排序树实现(C++封装)(二)
2015-02-02 14:22:46 来源: 作者: 【 】 浏览:19
Tags:排序 实现 封装
为叶子结点
? ? if (node->lChild == nullptr && node->rChild == nullptr){
? ? ? ? if (node->parent == nullptr){
? ? ? ? ? ? root = nullptr;
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? if (node->parent->lChild == node)
? ? ? ? ? ? ? ? node->parent->lChild = nullptr;
? ? ? ? ? ? else
? ? ? ? ? ? ? ? node->parent->rChild = nullptr;
? ? ? ? }
? ? ? ? delete node;
? ? }
? ? //被删节点只有左子树
? ? else if (node->lChild != nullptr && node->rChild == nullptr){
? ? ? ? //将左孩子的父亲指向被删节点的父亲
? ? ? ? node->lChild->parent = node->parent;
? ? ? ? //被删节点为根,修改根节点
? ? ? ? if (node->parent == nullptr)
? ? ? ? ? ? root = node->lChild;
? ? ? ? else if(node->parent->lChild == node)
? ? ? ? ? ? node->parent->lChild = node->lChild;
? ? ? ? else
? ? ? ? ? ? node->parent->rChild = node->lChild;
? ? ? ? delete node;
? ? }
? ? //被删节点只有右子树
? ? else if (node->lChild == nullptr && node->rChild != nullptr){
? ? ? ? //将右孩子的父亲指向被删节点的父亲
? ? ? ? node->rChild->parent = node->parent;
? ? ? ? //被删节点为根,修改根节点
? ? ? ? if (node->parent == nullptr)
? ? ? ? ? ? root = node->rChild;
? ? ? ? else if (node->parent->lChild == node)
? ? ? ? ? ? node->parent->lChild = node->rChild;
? ? ? ? else
? ? ? ? ? ? node->parent->rChild = node->rChild;
? ? ? ? delete node;
? ? }
? ? //被删节点左、右子树都有
? ? else {? //用后继节点取代删除节点,并删除后继
? ? ? ? pNode successor = SearchSuccessor(node);
? ? ? ? int temp = successor->data;
? ? ? ? DeleteNode(temp);
? ? ? ? node->data = temp;
? ? }
}


?


柝构函数
函数超出作用域范围时,清理占用内存。


?


BinaryTree::~BinaryTree()
{
? ? _delAllNode(root);
}
void BinaryTree::_delAllNode(pNode root){
? ? if (root != nullptr && root!=NULL){
? ? ? ? _delAllNode(root->lChild);
? ? ? ? _delAllNode(root->rChild);? ? ?
? ? ? ? DeleteNode(root->data);
? ? }
}


?


类的定义(头文件)


?


#pragma once


#include?
#include


class BinaryTree
{
private:
? ? typedef struct Node{
? ? ? ? struct Node * parent;
? ? ? ? struct Node * lChild;
? ? ? ? struct Node * rChild;
? ? ? ? int data;
? ? }*pNode;
? ? pNode root;
? ? void _visitMiddle(pNode root);
? ? pNode _searchKey(pNode root, int key);
? ? void _delAllNode(pNode root);
public:
? ? BinaryTree();
? ? BinaryTree(int * datum, int len);
? ? pNode SearchMaxNode(pNode node);
? ? pNode SearchMinNode(pNode node);
? ? pNode GetRoot();
? ? pNode SearchKey(int key);
? ? bool DeleteNode(int key);
? ? pNode SearchPredecessor(pNode node);
? ? pNode SearchSuccessor(pNode node);
? ? void VisitMiddle();
? ? bool InsertNode(pNode * cuRoot, int data, pNode self);
? ? ~BinaryTree();
};


调用示例


#include
#include "BinaryTree.h"


int main()
{
? ? int arrs[] = { 23, 65, 12, 3, 8, 76,? 90, 21, 75, 34,345, 61 };
? ? int len = sizeof(arrs) / sizeof(arrs[0]);
? ? BinaryTree bTree(arrs,len);
? ? bTree.DeleteNode(90);
? ? bTree.VisitMiddle();
? ? getch();
? ? return 0;
}


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇OpenCV使用RANSAC的仿射变换估计 .. 下一篇Linux编程中接收主函数返回值以及..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: