实现算法导论第三版中的二叉搜索树
来源:互联网 发布:淘宝自动发卡平台 编辑:程序博客网 时间:2024/06/06 15:42
使用C++实现。为了方便调试,加了一个输出函数。此函数,水平遍历树节点。
#include <stdlib.h>#include <stdio.h>#include <assert.h>#include <queue>#include <iostream>struct TNode{TNode * p; //parent nodeTNode * left; //left child nodeTNode * right; //right child nodeint key; //node valueTNode(int k);};TNode::TNode(int k):p(0), left(0), right(0), key(k){}class BinaryTree{private:TNode * root;public:BinaryTree();void Insert(TNode * z);void Print();TNode * Search(int k);TNode * Minimum(int k);TNode * Successor(int k);void InorderWalk();bool Delete(TNode * z);protected:void LevelOrder();TNode * Search(TNode * x, int k);TNode * Minimum(TNode * x);void InorderWalk(TNode * x);void Transplant(TNode * u, TNode * v);};BinaryTree::BinaryTree():root(0){}void BinaryTree::Insert(TNode * z){assert(z);TNode * y = 0;TNode * x = root;while(x != 0){y = x;if(z->key < x->key)x = x->left;elsex = x->right;}z->p = y;if(0 == y)root = z;else if(z->key < y->key)y->left = z;elsey->right = z;}void BinaryTree::Print(){LevelOrder();std::cout << std::endl;}TNode * BinaryTree::Search(int k){return Search(root, k);}TNode * BinaryTree::Minimum(int k){TNode * x = Search(k);if(!x)return 0;return Minimum(x);}TNode * BinaryTree::Successor(int k){TNode * x = Search(k);if(!x)return 0;if(x->right != 0)return Minimum(x->right);TNode * y = x->p;while(y != 0 && x == y->right){x = y;y = y->p;}return y;}void BinaryTree::InorderWalk(){InorderWalk(root);}bool BinaryTree::Delete(TNode * z){if(!root)return false;if(!z)return false;if(0 == z->left)Transplant(z, z->right);else if(0 == z->right)Transplant(z, z->left);else{TNode * y = Minimum(z->right); //= successor(z->right)assert(y);if(y->p != z) //case d{std::cout << "case d" << std::endl;Transplant(y, y->right);y->right = z->right;y->right->p = y;}std::cout << "case c" << std::endl;//y->p == zTransplant(z, y);y->left = z->left;y->left->p = y;}return true;}void BinaryTree::LevelOrder(){if(!root)return ;std::queue<TNode *> que;TNode * t = 0;que.push(root);while(!que.empty()){t = que.front();que.pop();if(0 == t->p)std::cout<<"R("<<t->key<<")";else if(t == t->p->left)std::cout<<"L("<<t->key<<")";elsestd::cout<<"R("<<t->key<<")";if(t->left != 0)que.push(t->left);if(t->right != 0)que.push(t->right);}}TNode * BinaryTree::Search(TNode * x, int k){while(x != 0 && k != x->key)k < x->key?(x = x->left):(x = x->right); return x;}TNode * BinaryTree::Minimum(TNode * x){while(x->left != 0)x = x->left;return x;}void BinaryTree::InorderWalk(TNode * x){if(x){InorderWalk(x->left);std::cout << x->key << "," << std::endl;InorderWalk(x->right);}}void BinaryTree::Transplant(TNode * u, TNode * v){if(0 == u->p) //u is rootroot = v;else if(u == u->p->left) //u is left child, let left child of the parent is vu->p->left = v;else //u is right childu->p->right = v;if(v != 0)v->p = u->p; //change child's parent}int main(){BinaryTree tree;TNode t15(15);TNode t5(5);TNode t18(18);TNode t3(3);TNode t2(2);TNode t4(4);TNode t7(7);TNode t13(13);TNode t9(9);TNode t17(17);TNode t20(20);TNode t6(6);tree.Insert(&t15);tree.Insert(&t5);tree.Insert(&t18);tree.Insert(&t3);tree.Insert(&t2);tree.Insert(&t4);tree.Insert(&t7);tree.Insert(&t6);tree.Insert(&t13);tree.Insert(&t9);tree.Insert(&t17);tree.Insert(&t20);tree.Print();std::cout << "----find----" << std::endl;TNode * res = tree.Search(13);if(!res)std::cout << "cann't find 13 in the tree" << std::endl;elsestd::cout << "find 13.it's parent key = " << res->p->key << std::endl;res = tree.Successor(13);if(!res)std::cout << "successor operator fail" << std::endl;elsestd::cout << "successor key = " << res->key << std::endl;std::cout << "\n----inorder walk----" << std::endl;tree.InorderWalk();std::cout << "\n-----------delete------------\n";//tree.Delete(&t7);//tree.Print();tree.Print();tree.Delete(&t5);tree.Print();return 0;}
0 0
- 实现算法导论第三版中的二叉搜索树
- 算法导论:c++实现二叉搜索树
- 实现算法导论第三版中的BTree
- 实现算法导论第三版中的MergeSort
- 算法导论-----二叉搜索树
- 算法导论-----------二叉搜索树
- 算法导论 二叉搜索树
- 算法导论--二叉搜索树
- 【算法导论】二叉搜索树
- 算法导论二叉搜索树
- 算法导论 二叉搜索树
- 算法导论二叉搜索树
- 算法导论 二叉搜索树
- 算法导论C语言实现: 二叉搜索树(binary tree)
- 算法导论 第12章 二叉搜索树 C++实现
- 算法导论第十二章-二叉搜索树-Cpp代码实现
- [算法导论]第十二章《二叉搜索树》
- 【算法导论】最优二叉搜索树
- Android手机中UID、PID作用及区别
- Java并发编程系列(一)——Volatile
- 通过 nginx 搞了一个反代,整合 谷歌学术, V2EX ,知乎等搜索的页面
- BZOJ 2152 聪聪可可
- 手机访问电脑中部署的tomcat应用
- 实现算法导论第三版中的二叉搜索树
- 数据结构————链表及其简单应用
- java读取配置文件
- 虚幻UE4中Matinee基础:骨架网格教程
- 基于高度的纹理混合shader
- 东南大学 崇志宏:信息融合和安全综述
- amchart-条形统计图
- 为什么要坚持每天写学到的知识
- 【算法】程序猿不写代码是不对的51