二叉树总结.docx

上传人:b****7 文档编号:10503330 上传时间:2023-02-17 格式:DOCX 页数:17 大小:16.94KB
下载 相关 举报
二叉树总结.docx_第1页
第1页 / 共17页
二叉树总结.docx_第2页
第2页 / 共17页
二叉树总结.docx_第3页
第3页 / 共17页
二叉树总结.docx_第4页
第4页 / 共17页
二叉树总结.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

二叉树总结.docx

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

二叉树总结.docx

二叉树总结

二叉树与二叉搜索树

指针与引用:

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){

queuemyqueue;

myqueue.push(nodePtr);

while(nodePtr){

cout<value<<"";

if(nodePtr->lchild){

myqueue.push(nodePtr->lchild);

}

if(nodePtr->rchild){

myqueue.push(nodePtr->rchild);

}

myqueue.pop();

nodePtr=myqueue.front();

}

while(!

myqueue.empty()){

cout<value<<"";

myqueue.pop();

}

}

/**

*Traversaltreeinpreorder

*/

voidpreorder(btNode*nodePtr){

if(nodePtr!

=NULL){

cout<value<

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<value<

}

}

/**

*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:

"<value<

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*m_root;

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*&t);

voidremove(constT&x,BinaryNode*&t);

BinaryNode*findMin(BinaryNode*t)const;

BinaryNode*findMax(BinaryNode*t)const;

boolcontains(constT&x,constBinaryNode*t)const;

voidmakeEmpty(BinaryNode*&t);

voidprintTreeInPrev(BinaryNode*t)const;

voidprintTreeInMid(BinaryNode*t)const;

voidprintTreeInPost(BinaryNode*t)const;

};

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*t)const

{

if(!

t)

returnfalse;

elseif(xelement)

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*BinarySearchTree:

:

findMin(BinaryNode*t)const

{

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

if(!

t)

returnNULL;

if(t->left==NULL)

returnt;

else

returnfindMin(t->left);

}

//findthemaxvalueinthetree

template

constT&BinarySearchTree:

:

findMax()const

{

returnfindMax(m_root)->element;

}

template

BinaryNode*BinarySearchTree:

:

findMax(BinaryNode*t)const

{

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

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*&t)

{

if(t==NULL)

t=newBinaryNode(x,NULL,NULL);//注意这个指针参数是引用

elseif(xelement)

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*&t)

{

if(t==NULL)

return;

if(xelement)

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*oldNode=t;

t=(t->left!

=NULL)?

t->left:

t->right;

deleteoldNode;

}

}

}

template

voidBinarySearchTree:

:

makeEmpty()

{

makeEmpty(m_root);

}

template

voidBinarySearchTree:

:

makeEmpty(BinaryNode*&t)

{

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*t)const

{

if(t)

{

cout<element;

printTreeInPrev(t->left);

printTreeInPrev(t->right);

}

}

template

voidBinarySearchTree:

:

printTreeInMid(BinaryNode*t)const

{

if(t)

{

printTreeInPrev(t->left);

cout<element;

printTreeInPrev(t->right);

}

}

template

voidBinarySearchTree:

:

printTreeInPost(BinaryNode*t)const

{

if(t)

{

printTreeInPost(t->left);

printTreeInPost(t->right);

cout<element;

}

}

intmain(){

BinarySearchTreebst;

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:

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

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

当前位置:首页 > 高等教育 > 军事

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

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