二叉树总结Word文档下载推荐.docx

上传人:b****4 文档编号:16995372 上传时间:2022-11-27 格式:DOCX 页数:14 大小:17.01KB
下载 相关 举报
二叉树总结Word文档下载推荐.docx_第1页
第1页 / 共14页
二叉树总结Word文档下载推荐.docx_第2页
第2页 / 共14页
二叉树总结Word文档下载推荐.docx_第3页
第3页 / 共14页
二叉树总结Word文档下载推荐.docx_第4页
第4页 / 共14页
二叉树总结Word文档下载推荐.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

二叉树总结Word文档下载推荐.docx

《二叉树总结Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《二叉树总结Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。

二叉树总结Word文档下载推荐.docx

structBTNode*lchild,*rchild;

}btNode;

/**

*buildtree

*/

voidcreateTree(btNode*&

nodePtr){

charc;

cin>

>

c;

if(c!

='

0'

){

nodePtr=newbtNode();

nodePtr->

value=c;

createTree(nodePtr->

lchild);

rchild);

}

}

*Traversaltreeinlevelorder

voidlevelorder(btNode*nodePtr){

queue<

btNode*>

myqueue;

myqueue.push(nodePtr);

while(nodePtr){

cout<

<

nodePtr->

value<

"

"

;

if(nodePtr->

lchild){

myqueue.push(nodePtr->

}

rchild){

myqueue.pop();

nodePtr=myqueue.front();

while(!

myqueue.empty()){

myqueue.front()->

*Traversaltreeinpreorder

voidpreorder(btNode*nodePtr){

if(nodePtr!

=NULL){

endl;

preorder(nodePtr->

*Traversaltreeininorder

voidinorder(btNode*nodePtr,stringpreStr){

inorder(nodePtr->

lchild,preStr+"

);

(preStr+nodePtr->

value)<

rchild,preStr+"

*Traversaltreeinpostorder

voidpostorder(btNode*nodePtr){

postorder(nodePtr->

*countthenumberofleaf

voidleafcount(btNode*nodePtr,int&

count){

if(nodePtr){

lchild==NULL&

&

nodePtr->

rchild==NULL)count++;

leafcount(nodePtr->

lchild,count);

rchild,count);

*countthenumberofnode

voidnodecount(btNode*nodePtr,int&

count++;

nodecount(nodePtr->

*recordthedepthoftree

voidtreedepth(btNode*nodePtr,intlevel,int&

depth){

rchild==NULL)

if(level>

depth)depth=level;

treedepth(nodePtr->

lchild,level+1,depth);

rchild,level+1,depth);

}

*destroythetree

voiddestroytree(btNode*nodePtr){

destroytree(nodePtr->

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:

count<

//nodecount(root,count);

Thenumberofnodeis:

//intdepth=0;

//treedepth(root,0,depth);

Thedepthoftreeis:

depth<

destroytree(root);

return0;

创建二叉搜索树

1)添加节点

2)显示树

3)删除节点

4)各种工具函数

BSTTree.cpp

enumORDER_MODE

{

ORDER_MODE_PREV=0,

ORDER_MODE_MID,

ORDER_MODE_POST

};

template<

classT>

structBinaryNode

Telement;

BinaryNode*left;

BinaryNode*right;

BinaryNode(constT&

theElement,

BinaryNode*lt,

BinaryNode*rt):

element(theElement),

left(lt),

right(rt)

{

classBinarySearchTree

private:

BinaryNode<

T>

*m_root;

public:

BinarySearchTree();

BinarySearchTree(constBinarySearchTree&

rhs);

~BinarySearchTree();

constT&

findMin()const;

findMax()const;

boolcontains(constT&

x)const;

voidprintTree(ORDER_MODEeOrderMode=ORDER_MODE_PREV)const;

voidmakeEmpty();

voidinsert(constT&

x);

voidremove(constT&

//因为树的方法用到了很多递归,所以这里我们需要申明如下的私有成员函数

x,BinaryNode<

*&

t);

*findMin(BinaryNode<

*t)const;

*findMax(BinaryNode<

x,constBinaryNode<

voidmakeEmpty(BinaryNode<

t);

voidprintTreeInPrev(BinaryNode<

voidprintTreeInMid(BinaryNode<

*t)const;

voidprintTreeInPost(BinaryNode<

BinarySearchTree<

:

BinarySearchTree()

m_root=NULL;

rhs)

m_root=rhs.m_root;

~BinarySearchTree()

makeEmpty();

//returntrueifthexisfoundinthetree

boolBinarySearchTree<

contains(constT&

x)const

returncontains(x,m_root);

*t)const

if(!

t)

returnfalse;

elseif(x<

t->

element)

returncontains(x,t->

left);

elseif(x>

right);

else

returntrue;

//findtheminvalueinthetree

constT&

BinarySearchTree<

findMin()const

returnfindMin(m_root)->

element;

BinaryNode<

*BinarySearchTree<

findMin(BinaryNode<

//二叉树的一个特点就是左子叶的值比根节点小,右子叶的比根节点的大

returnNULL;

if(t->

left==NULL)

returnt;

returnfindMin(t->

//findthemaxvalueinthetree

findMax()const

returnfindMax(m_root)->

findMax(BinaryNode<

if(t!

=NULL)

while(t->

right!

t=t->

right;

returnt;

//insertanelementintotree

voidBinarySearchTree<

insert(constT&

x)

insert(x,m_root);

insert(constT&

t)

if(t==NULL)

t=newBinaryNode<

(x,NULL,NULL);

//注意这个指针参数是引用

insert(x,t->

;

//donothing

//removeaelementintatree

remove(constT&

returnremove(x,m_root);

return;

if(x<

remove(x,t->

remove(x,t->

else//now==

if(t->

left!

=NULL&

t->

=NULL)//twochild

{

element=findMin(t->

right)->

remove(t->

element,t->

else

BinaryNode<

*oldNode=t;

t=(t->

=NULL)?

left:

deleteoldNode;

makeEmpty()

makeEmpty(m_root);

makeEmpty(BinaryNode<

if(t)

makeEmpty(t->

deletet;

t=NULL;

//Printtree

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

printTreeInPrev(BinaryNode<

cout<

printTreeInPrev(t->

printTreeInMid(BinaryNode<

printTreeInPost(BinaryNode<

printTreeInPost(t->

intmain(){

int>

bst;

bst.insert(5);

bst.insert(6);

bst.insert(7);

bst.insert(9);

bst.insert(4);

bst.printTree();

bst.remove(7);

二叉搜索树总结:

1.这里x最好声明为constT&

x,涉及到递归,值传递浪费空间,引用同时声明为常量

2.修改树的结构时一般都是引用,是不是在递归一般都这样呢?

3.remove的辅助函数findMin这里可以不用通过递归,所以可以不需要在public弄一个接口但是这里还是需要将其放到private中去,findMin目前不会单独作为一个功能提供给开发者,只是一个工具函数,放到private中去更合理

 

Ps:

还有老多不理解的地方,指针真难,后期跟进!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 公务员考试

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

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