二叉查找树C++实现

二分查找树特点:(1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)任意节点的左、右子树

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

二叉查找树C++实现此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“”,获取验证码。在微信里搜索“”或者“”或者微信扫描右侧二维码都可以关注本站微信公众号。

二分查找树特点:

(1) 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2) 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3) 任意节点的左、右子树也分别为二叉查找树。

(4) 没有键值相等的节点(no duplicate nodes)。

前序遍历:中左右

中序遍历:左中右

序遍历:左右中

二叉查找树的重点在于如何找节点的前驱节点和后继节点

二叉查找树C++实现
二叉查找树C++实现

#pragma once #include <iostream> using namespace std; template <class T> class BSTNode { public: T key; BSTNode *parent; BSTNode *left; BSTNode *right; BSTNode(T value, BSTNode *p, BSTNode *l, BSTNode *r):key(value),parent(p),left(l),right(r) { } }; template <class T> class BSTree { private: BSTNode<T> *mRoot; public: BSTree():mRoot(NULL){} ~BSTree(){} // 前序排序 void preOrder() { preOrder(mRoot); } void inOrder() { inOrder(mRoot); } void postOrder() { postOrder(mRoot); } // 查找二叉树中键值为key的节点 BSTNode<T>* SearchKey(const T key) { return SearchKey(mRoot, key); } BSTNode<T>* minKey() { return minKey(mRoot); } BSTNode<T>* maxKey() { return maxKey(mRoot); } // 插入节点 void insert( T key) { BSTNode<T> *z = new BSTNode<T>(key, NULL, NULL, NULL); if (z == NULL) { return; } insert(mRoot, z); } private: // 前序排序 void preOrder(BSTNode<T> *tree) const { if (tree != NULL) { cout << tree->key << " "; preOrder(tree->left); preOrder(tree->right); } } // 中序排序 void inOrder(BSTNode<T> *tree) const { if (tree != NULL) { preOrder(tree->left); cout << tree->key << " "; preOrder(tree->right); } } // 后序排序 void postOrder(BSTNode<T> *tree) const { if (tree != NULL) { preOrder(tree->left); preOrder(tree->right); cout << tree->key << " "; } } BSTNode<T>* SearchKey(BSTNode<T>* pNode, const T key) const { // 递归查找 /*if (pNode = NULL || key == pNode->key) { return pNode; } else if (key > pNode->key) { return SearchKey(pNode->right); } else { return SearchKey(pNode->left); }*/ // 非递归查找 BSTNode<T>* x = pNode; while (x != NULL) { if (key > x->key) { x = x->right; } else if (key < x->key) { x = x->left; } else { return x; } } return NULL; } // 将节点插入到二叉树中 void insert(BSTNode<T>* &tree, BSTNode<T> *Node) { BSTNode<T> *y = NULL; BSTNode<T> *x = tree; while (NULL != x) { y = x; if (Node->key > x->key) { x = x->right; } else { x = x->left; } } Node->parent = y; // 这到后面两句为关键代码 if (NULL == y) { tree = Node; } else if (Node->key > y->key) { y->right = Node; } else { y->left = Node; } } // 查找最小节点 BSTNode<T>* minKey(BSTNode<T>* pNode) const { while (pNode != NULL) { pNode = pNode->left; } return pNode; } BSTNode<T>* maxKey(BSTNode<T>* pNode) const { while (pNode != NULL) { pNode = pNode->right; } return pNode; } // 找节点(x)的后继节点。即查找二叉树中数值大于该节点的最小值 BSTNode<T>* Successor(BSTNode<T>* x) { // 分三种情况 // 1. x有右孩子,找到以右孩子为根的子树的最小节点 // 2. x没有右孩子,当x为左孩子,则x的父节点为后继节点 // 2. x没有右孩子,当x为右孩子,则找x的最低父节点,并且该父节点具有左孩子 if (x->right != NULL) { return minKey(x->right); } BSTNode<T>* y = x->parent; while ((NULL != y) &&(x == y->right)) { x= y; y = y->parent; } return y; } // 找结点(x)的前驱结点。即查找"二叉树中数据值小于该结点"的"最大结点" BSTNode<T>* BSTree<T>::predecessor(BSTNode<T> *x) { // 如果x存在左孩子,则"x的前驱结点"为 "以其左孩子为根的子树的最大结点"。 if (x->left != NULL) return maxKey(x->left); // 如果x没有左孩子。则x有以下两种可能: // (01) x是"一个右孩子",则"x的前驱结点"为 "它的父结点"。 // (01) x是"一个左孩子",则查找"x的最低的父结点,并且该父结点要具有右孩子",找到的这个"最低的父结点"就是"x的前驱结点"。 BSTNode<T>* y = x->parent; while ((y!=NULL) && (x==y->left)) { x = y; y = y->parent; } return y; } // 删除二叉树中的节点,并返回被删除的节点 //BSTNode<T>* RemoveNode(BSTNode<T>* &tree, BSTNode<T>* pNode) //{ // BSTNode<T>* x = tree; // while (NULL != x && pNode->key != x->key) // { // if (pNode->key > x->key) // { // x = x->right; // } // else if (pNode->key < x->key) // { // x = x->left; // } // } // // 找到或x为空 //} };

View Code

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/120253.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • [精选]图文详解到底什么是三次握手四次挥手「建议收藏」

    [精选]图文详解到底什么是三次握手四次挥手

  • Vue实现文件上传和文件下载

    Vue实现文件上传和文件下载文件下载:文件下载通常有几种方法1.通过url下载2.location.href3.form提交直接下载4.HTML5a.download结合blob对象进行下载第一种方式:第一种方法是前后端的接口只给了一个API请求:前端第一个实现是使用a标签,第二种方式:这个方法是直接把DataURLs或者BlogURLs传到浏览器地址中触发下载。有两种…

  • apifox的使用_api如何使用

    apifox的使用_api如何使用快速上手使用场景Apifox是接口管理、开发、测试全流程集成工具,使用受众为整个研发技术团队,主要使用者为前端开发、后端开发和测试人员。前端开发接口文档管理接口数据Mock接口调试前

  • docker启动镜像容器命令_镜像删除

    docker启动镜像容器命令_镜像删除一、查看当前docker中下载的镜像,如下图,当前我的Docker容器中存在两个镜像,tomcat、mysql二、启动镜像(因启动命令参数过多,同时各种镜像启动时可以增加额外的参数,本次以启动mysql5.6为例)dockerrun-p本机映射端口:镜像映射端口-d–name启动镜像名称-e镜像启动参数镜像名称:镜像版本号参数释义:-p本机端口和容器启动端口映射-d后台运行–name容器名称-e镜像启动参数例:

  • 口罩、安全帽识别比赛踩坑记(二) 比赛流程及 SSD / YOLO V3 两版本实现[通俗易懂]

    口罩、安全帽识别比赛踩坑记(二) 比赛流程及 SSD / YOLO V3 两版本实现[通俗易懂]本篇文章主要对比赛流程中的各个环节进行展开说明,并对笔者践行过的代码及更改的地方进行记录。如哪里有侵权请联系笔者进行删除。另外在这里对比赛举办方表示感谢~~其中开源代码会在整理后放在github上,并给出相应的链接,这里先留一个小尾巴~~相关有用的链接如下:口罩、安全帽识别比赛踩坑记(一)经验漫谈及随想比赛官方开发环境指导Dockerfile官方文档OpenVINO官方文档…

  • 如何通过JNI传递对象执行回调

    如何通过JNI传递对象执行回调

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号