ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:16.94KB ,
资源ID:10503330      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10503330.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(二叉树总结.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

二叉树总结.docx

1、二叉树总结 二叉树 与 二叉搜索树指针与引用:1) int count = 18;int* ptr = &count;2) int count = 18;int& pcount = count;创建二叉树与创建二叉搜索树 前者:只是为了熟悉课本知识 后者:具有实际应用的功能* 比较两者之间的区别,并且考虑是否可以相互转化,为什么?创建二叉树:1) 创建二叉树2) 层次遍历3) 前序遍历4) 中序遍历5) 后续遍历6) 统计叶子节点7) 统计节点数8) 树的深度9) 销毁二叉树BTTree.cpp#include #include #include using namespace std;typ

2、edef struct BTNode char value; struct BTNode * lchild, * rchild;btNode;/* build tree */void createTree(btNode* & nodePtr) char c; cinc; if(c != 0) nodePtr = new btNode(); nodePtr-value = c; createTree(nodePtr-lchild); createTree(nodePtr-rchild); /* Traversal tree in levelorder*/void levelorder(btNod

3、e* nodePtr) queue myqueue; myqueue.push(nodePtr); while(nodePtr) coutvaluelchild) myqueue.push(nodePtr-lchild); if(nodePtr-rchild) myqueue.push(nodePtr-rchild); myqueue.pop(); nodePtr=myqueue.front(); while(!myqueue.empty() coutvalue ; myqueue.pop(); /* Traversal tree in preorder*/void preorder(btNo

4、de* nodePtr) if(nodePtr != NULL) coutvaluelchild); preorder(nodePtr-rchild); /* Traversal tree in inorder*/void inorder(btNode* nodePtr, string preStr) if(nodePtr != NULL) inorder(nodePtr-lchild, preStr + ); coutvalue)rchild, preStr + ); /* Traversal tree in postorder*/void postorder(btNode* nodePtr

5、) if(nodePtr != NULL) postorder(nodePtr-lchild); postorder(nodePtr-rchild); coutvaluelchild = NULL & nodePtr-rchild = NULL) count+; leafcount(nodePtr-lchild, count); leafcount(nodePtr-rchild, count); /* count the number of node*/void nodecount(btNode* nodePtr, int& count) if(nodePtr) count+; nodecou

6、nt(nodePtr-lchild, count); nodecount(nodePtr-rchild, count); /* record the depth of tree */void treedepth(btNode* nodePtr, int level, int& depth) if(nodePtr) if(nodePtr-lchild = NULL & nodePtr-rchild = NULL) if(level depth) depth = level; treedepth(nodePtr-lchild, level+1, depth); treedepth(nodePtr-

7、rchild, level+1, depth); /* destroy the tree */void destroytree(btNode* nodePtr) if(nodePtr) destroytree(nodePtr-lchild); destroytree(nodePtr-rchild); coutI am free : valueendl; delete(nodePtr); int main() btNode* root; / init root and build tree createTree(root); /levelorder(root); /preorder(root);

8、 /inorder(root,); /postorder(root); /int count=0; / the number of leaf /leafcount(root, count); /coutThe number of leaf is : countendl; /int count=0; /nodecount(root, count); /coutThe number of node is : countendl; /int depth=0; /treedepth(root, 0, depth); /coutThe depth of tree is : depthendl; dest

9、roytree(root); return 0;创建二叉搜索树1) 添加节点2) 显示树3) 删除节点4) 各种工具函数BSTTree.cpp#include using namespace std;enum ORDER_MODE ORDER_MODE_PREV = 0, ORDER_MODE_MID, ORDER_MODE_POST;template struct BinaryNode T element; BinaryNode *left; BinaryNode *right; BinaryNode(const T& theElement, BinaryNode *lt, BinaryNo

10、de *rt): element(theElement), left(lt), right(rt) ;template class BinarySearchTreeprivate: BinaryNode *m_root;public: BinarySearchTree(); BinarySearchTree(const BinarySearchTree& rhs); BinarySearchTree(); const T& findMin() const; const T& findMax() const; bool contains(const T& x) const; void print

11、Tree(ORDER_MODE eOrderMode = ORDER_MODE_PREV) const; void makeEmpty(); void insert(const T& x); void remove(const T& x);private: /因为树的方法用到了很多递归, 所以这里我们需要申明如下的私有成员函数 void insert(const T& x, BinaryNode* &t) ; void remove(const T& x, BinaryNode* &t) ; BinaryNode* findMin( BinaryNode* t) const; BinaryNo

12、de* findMax( BinaryNode* t) const; bool contains(const T& x, const BinaryNode* t) const; void makeEmpty(BinaryNode* &t); void printTreeInPrev(BinaryNode* t) const; void printTreeInMid(BinaryNode* t)const; void printTreeInPost(BinaryNode* t)const;template BinarySearchTree:BinarySearchTree() m_root =

13、NULL;template BinarySearchTree: BinarySearchTree(const BinarySearchTree& rhs) m_root = rhs.m_root;template BinarySearchTree: BinarySearchTree() makeEmpty();/ return true if the x is found in the treetemplate bool BinarySearchTree:contains(const T& x) const return contains(x, m_root);template bool Bi

14、narySearchTree:contains(const T& x, const BinaryNode* t) const if (!t) return false; else if (x element) return contains(x, t-left); else if (x t-element) return contains(x, t-right); else return true;/ find the min value in the treetemplate const T& BinarySearchTree:findMin() const return findMin(m

15、_root)-element;template BinaryNode* BinarySearchTree:findMin( BinaryNode* t) const /二叉树的一个特点就是左子叶的值比根节点小, 右子叶的比根节点的大 if (!t) return NULL; if (t-left = NULL) return t; else return findMin(t-left);/ find the max value in the treetemplate const T& BinarySearchTree:findMax() const return findMax(m_root)

16、-element;template BinaryNode* BinarySearchTree:findMax( BinaryNode* t) const /二叉树的一个特点就是左子叶的值比根节点小, 右子叶的比根节点的大 if (t != NULL) while (t-right != NULL) t = t-right; return t;/insert an element into treetemplate void BinarySearchTree: insert(const T& x) insert(x, m_root);template void BinarySearchTree:

17、insert(const T& x, BinaryNode* &t) if (t = NULL) t = new BinaryNode(x, NULL, NULL);/注意这个指针参数是引用 else if (x element) insert(x, t-left); else if (x t-element) insert(x, t-right); else ;/do nothing/remove a element int a treetemplate void BinarySearchTree:remove(const T& x) return remove(x, m_root);tem

18、plate void BinarySearchTree:remove(const T& x, BinaryNode* &t) if (t = NULL) return; if (x element) remove(x, t-left); else if (x t-element) remove (x, t-right); else / now = if (t-left != NULL & t-right != NULL)/two child t-element = findMin(t-right)-element; remove(t-element, t-right); else Binary

19、Node *oldNode = t; t = (t-left != NULL) ? t-left : t-right; delete oldNode; template void BinarySearchTree:makeEmpty() makeEmpty(m_root);template void BinarySearchTree:makeEmpty(BinaryNode* &t) if (t) makeEmpty(t-left); makeEmpty(t-right); delete t; t = NULL;/Print treetemplate void BinarySearchTree

20、:printTree(ORDER_MODE eOrderMode /*= ORDER_MODE_PREV*/) const if (ORDER_MODE_PREV = eOrderMode) printTreeInPrev(m_root); else if (ORDER_MODE_MID = eOrderMode) printTreeInMid(m_root); else if (ORDER_MODE_POST = eOrderMode) printTreeInPost(m_root); else ;/do nothingtemplate void BinarySearchTree:print

21、TreeInPrev(BinaryNode* t) const if (t) cout element; printTreeInPrev(t-left); printTreeInPrev(t-right); template void BinarySearchTree:printTreeInMid(BinaryNode* t) const if (t) printTreeInPrev(t-left); cout element; printTreeInPrev(t-right); template void BinarySearchTree:printTreeInPost(BinaryNode

22、* t) const if (t) printTreeInPost(t-left); printTreeInPost(t-right); cout element; int main() BinarySearchTree bst; bst.insert(5); bst.insert(6); bst.insert(7); bst.insert(9); bst.insert(4); bst.printTree(); bst.remove(7); bst.printTree(); return 0;二叉搜索树总结: 1.这里x最好声明为const T& x,涉及到递归,值传递浪费空间,引用同时声明为常量2.修改树的结构时一般都是引用,是不是在递归一般都这样呢?3. remove 的辅助函数findMin 这里可以不用通过递归,所以可以不需要在public弄一个接口但是这里还是需要将其放到private中去,findMin目前不会单独作为一个功能提供给开发者,只是一个工具函数,放到private中去更合理Ps:还有老多不理解的地方,指针真难,后期跟进!

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1