二叉树总结.docx
- 文档编号:4079345
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:14
- 大小:17.01KB
二叉树总结.docx
《二叉树总结.docx》由会员分享,可在线阅读,更多相关《二叉树总结.docx(14页珍藏版)》请在冰豆网上搜索。
二叉树总结
二叉树与二叉搜索树
指针与引用:
1)intcount=18;
int*ptr=&count;
2)intcount=18;
int&pcount=count;
创建二叉树与创建二叉搜索树
前者:
只是为了熟悉课本知识
后者:
具有实际应用的功能
***比较两者之间的区别,并且考虑是否可以相互转化,为什么?
?
创建二叉树:
1)创建二叉树
2)层次遍历
3)前序遍历
4)中序遍历
5)后续遍历
6)统计叶子节点
7)统计节点数
8)树的深度
9)销毁二叉树
BTTree.cpp
#include
#include
#include
usingnamespacestd;
typedefstructBTNode{
charvalue;
structBTNode*lchild,*rchild;
}btNode;
/**
*buildtree
*/
voidcreateTree(btNode*&nodePtr){
charc;
cin>>c;
if(c!
='0'){
nodePtr=newbtNode();
nodePtr->value=c;
createTree(nodePtr->lchild);
createTree(nodePtr->rchild);
}
}
/**
*Traversaltreeinlevelorder
*/
voidlevelorder(btNode*nodePtr){
queue
myqueue.push(nodePtr);
while(nodePtr){
cout<
if(nodePtr->lchild){
myqueue.push(nodePtr->lchild);
}
if(nodePtr->rchild){
myqueue.push(nodePtr->rchild);
}
myqueue.pop();
nodePtr=myqueue.front();
}
while(!
myqueue.empty()){
cout<
myqueue.pop();
}
}
/**
*Traversaltreeinpreorder
*/
voidpreorder(btNode*nodePtr){
if(nodePtr!
=NULL){
cout< preorder(nodePtr->lchild); preorder(nodePtr->rchild); } } /** *Traversaltreeininorder */ voidinorder(btNode*nodePtr,stringpreStr){ if(nodePtr! =NULL){ inorder(nodePtr->lchild,preStr+""); cout<<(preStr+nodePtr->value)< inorder(nodePtr->rchild,preStr+""); } } /** *Traversaltreeinpostorder */ voidpostorder(btNode*nodePtr){ if(nodePtr! =NULL){ postorder(nodePtr->lchild); postorder(nodePtr->rchild); cout< } } /** *countthenumberofleaf */ voidleafcount(btNode*nodePtr,int&count){ if(nodePtr){ if(nodePtr->lchild==NULL&&nodePtr->rchild==NULL)count++; leafcount(nodePtr->lchild,count); leafcount(nodePtr->rchild,count); } } /** *countthenumberofnode */ voidnodecount(btNode*nodePtr,int&count){ if(nodePtr){ count++; nodecount(nodePtr->lchild,count); nodecount(nodePtr->rchild,count); } } /** *recordthedepthoftree */ voidtreedepth(btNode*nodePtr,intlevel,int&depth){ if(nodePtr){ if(nodePtr->lchild==NULL&&nodePtr->rchild==NULL) if(level>depth)depth=level; treedepth(nodePtr->lchild,level+1,depth); treedepth(nodePtr->rchild,level+1,depth); } } /** *destroythetree */ voiddestroytree(btNode*nodePtr){ if(nodePtr){ destroytree(nodePtr->lchild); destroytree(nodePtr->rchild); cout<<"Iamfree: "< delete(nodePtr); } } intmain(){ btNode*root; //initrootandbuildtree createTree(root); //levelorder(root); //preorder(root); //inorder(root,""); //postorder(root); //intcount=0;//thenumberofleaf //leafcount(root,count); //cout<<"Thenumberofleafis: "< //intcount=0; //nodecount(root,count); //cout<<"Thenumberofnodeis: "< //intdepth=0; //treedepth(root,0,depth); //cout<<"Thedepthoftreeis: "< destroytree(root); return0; } 创建二叉搜索树 1)添加节点 2)显示树 3)删除节点 4)各种工具函数 BSTTree.cpp #include usingnamespacestd; enumORDER_MODE { ORDER_MODE_PREV=0, ORDER_MODE_MID, ORDER_MODE_POST }; template structBinaryNode { Telement; BinaryNode*left; BinaryNode*right; BinaryNode(constT&theElement, BinaryNode*lt, BinaryNode*rt): element(theElement), left(lt), right(rt) { } }; template classBinarySearchTree { private: BinaryNode public: BinarySearchTree(); BinarySearchTree(constBinarySearchTree&rhs); ~BinarySearchTree(); constT&findMin()const; constT&findMax()const; boolcontains(constT&x)const; voidprintTree(ORDER_MODEeOrderMode=ORDER_MODE_PREV)const; voidmakeEmpty(); voidinsert(constT&x); voidremove(constT&x); private: //因为树的方法用到了很多递归,所以这里我们需要申明如下的私有成员函数 voidinsert(constT&x,BinaryNode voidremove(constT&x,BinaryNode BinaryNode BinaryNode boolcontains(constT&x,constBinaryNode voidmakeEmpty(BinaryNode voidprintTreeInPrev(BinaryNode voidprintTreeInMid(BinaryNode voidprintTreeInPost(BinaryNode }; template BinarySearchTree : BinarySearchTree() { m_root=NULL; } template BinarySearchTree : BinarySearchTree(constBinarySearchTree&rhs) { m_root=rhs.m_root; } template BinarySearchTree : ~BinarySearchTree() { makeEmpty(); } //returntrueifthexisfoundinthetree template boolBinarySearchTree : contains(constT&x)const { returncontains(x,m_root); } template boolBinarySearchTree : contains(constT&x,constBinaryNode { if(! t) returnfalse; elseif(x returncontains(x,t->left); elseif(x>t->element) returncontains(x,t->right); else returntrue; } //findtheminvalueinthetree template constT&BinarySearchTree : findMin()const { returnfindMin(m_root)->element; } template BinaryNode : findMin(BinaryNode { //二叉树的一个特点就是左子叶的值比根节点小,右子叶的比根节点的大 if(! t) returnNULL; if(t->left==NULL) returnt; else returnfindMin(t->left); } //findthemaxvalueinthetree template constT&BinarySearchTree : findMax()const { returnfindMax(m_root)->element; } template BinaryNode : findMax(BinaryNode { //二叉树的一个特点就是左子叶的值比根节点小,右子叶的比根节点的大 if(t! =NULL) while(t->right! =NULL) t=t->right; returnt; } //insertanelementintotree template voidBinarySearchTree : insert(constT&x) { insert(x,m_root); } template voidBinarySearchTree : insert(constT&x,BinaryNode { if(t==NULL) t=newBinaryNode elseif(x insert(x,t->left); elseif(x>t->element) insert(x,t->right); else ;//donothing } //removeaelementintatree template voidBinarySearchTree : remove(constT&x) { returnremove(x,m_root); } template voidBinarySearchTree : remove(constT&x,BinaryNode { if(t==NULL) return; if(x remove(x,t->left); elseif(x>t->element) remove(x,t->right); else//now== { if(t->left! =NULL&& t->right! =NULL)//twochild { t->element=findMin(t->right)->element; remove(t->element,t->right); } else { BinaryNode t=(t->left! =NULL)? t->left: t->right; deleteoldNode; } } } template voidBinarySearchTree : makeEmpty() { makeEmpty(m_root); } template voidBinarySearchTree : makeEmpty(BinaryNode { if(t) { makeEmpty(t->left); makeEmpty(t->right); deletet; } t=NULL; } //Printtree template voidBinarySearchTree : printTree(ORDER_MODEeOrderMode/*=ORDER_MODE_PREV*/)const { if(ORDER_MODE_PREV==eOrderMode) printTreeInPrev(m_root); elseif(ORDER_MODE_MID==eOrderMode) printTreeInMid(m_root); elseif(ORDER_MODE_POST==eOrderMode) printTreeInPost(m_root); else ;//donothing } template voidBinarySearchTree : printTreeInPrev(BinaryNode { if(t) { cout< printTreeInPrev(t->left); printTreeInPrev(t->right); } } template voidBinarySearchTree : printTreeInMid(BinaryNode { if(t) { printTreeInPrev(t->left); cout< printTreeInPrev(t->right); } } template voidBinarySearchTree : printTreeInPost(BinaryNode { if(t) { printTreeInPost(t->left); printTreeInPost(t->right); cout< } } intmain(){ BinarySearchTree bst.insert(5); bst.insert(6); bst.insert(7); bst.insert(9); bst.insert(4); bst.printTree(); bst.remove(7); bst.printTree(); return0; } 二叉搜索树总结: 1.这里x最好声明为constT&x,涉及到递归,值传递浪费空间,引用同时声明为常量 2.修改树的结构时一般都是引用,是不是在递归一般都这样呢? ? 3.remove的辅助函数findMin这里可以不用通过递归,所以可以不需要在public弄一个接口但是这里还是需要将其放到private中去,findMin目前不会单独作为一个功能提供给开发者,只是一个工具函数,放到private中去更合理 Ps: 还有老多不理解的地方,指针真难,后期跟进! !
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 总结