树的操作
Posted 勇士后卫头盔哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树的操作相关的知识,希望对你有一定的参考价值。
树的属性操作
树的属性操作具体指的就是树中结点的数目,树的高度,树的度数等…
1.树中结点的数目
查找树中结点数目的操作是递归完成的,是递归就有递归出口,当结点为空或者结点的子链表长度为0时就为递归出口,上图就是递归公式的提炼,我们看到下图,要求出该树的结点数可以分为3个部分,count(B)表示求以B为根结点的树的结点数,count©表示求以C为根结点的树的结点数,count(D)表示求以D为根结点的树的结点数,看得count(A)的同时又用到count©这就是一个递归调用的过程
代码演示
int count(GTreeNode<T>* node)const
int ret = 0;
if(node!=NULL)
ret = 1;
for(node->child.move(0);!node->child.end();node->child.next())
ret+=count(node->child.current());
return ret;
结果:
13
2.树中的高度
求树中的高度也是递归调用的,树中的高度等于其子树的高度的最大值+1,递归公式如下所示
int height(GTreeNode<T>* node)const
int ret = 0;
if(node!=NULL)
for(node->child.move(0);!node->child.end();node->child.next())
int h= height(node->child.current());
if(ret<h)
ret = h;
ret = ret + 1;
return ret;
结果
4
3.树的度数
求树的度数也是递归进行的
树的层次遍历
树是非线性的数据结构,树的结点没有固定的编号方式,为通用树结构提供新的方法,快速遍历每一个结点,设计思路就是引入一个游标,在树中定义一个游标(GTreeNode*),遍历开始前将游标指向根结点(root()),获取游标指向的数据元素,通过结点中的child成员移动游标,具体思路如下图所示,
具体操作:
我们新建一个队列,begin时将根节点A加入队列,然后打印出根节点A的值,接着将将队列的头结点A提出队列并将根节点A的子节点B,C,D加入队列中,此时打印出B节点的值并将B节点提出队列,接着将B节点的字节点E,F加入队列…依次类推就能将树的节点按层次打印出来
begin
bool begin()
bool ret = (root()!=NULL);//判断根节点是否为空
if(ret)
m_queue.clear();//清除队列
m_queue.add(root());//在队列中加入根节点
return ret;
next
bool next()
bool ret = (m_queue.length()>0);//判断队列长度是否大于0
if(ret)
GTreeNode<T> *node = m_queue.front();//取出队列头节点
m_queue.remove();//删除该头节点
for(node->child.move(0);!node->child.end();node->child.next())//将删除头结点的子节点加入队列中
m_queue.add(node->child.current());
return ret;
current
T current()
if(!end())
return m_queue.front()->value;//若没有结束则打印节点值
else
THROW_EXCEPTION(InvalidParamterException,"No value at current position....");
end
bool end()
return (m_queue.length()==0);
测试代码:
int main()
GTree<char> t;
GTreeNode<char> *node = NULL;
GTreeNode<char> root;
t.insert('A',NULL);
node = t.find('A');
t.insert('B',node);
t.insert('C',node);
t.insert('D',node);
node = t.find('B');
t.insert('E',node);
t.insert('F',node);
node = t.find('E');
t.insert('K',node);
t.insert('L',node);
node = t.find('C');
t.insert('G',node);
node = t.find('D');
t.insert('H',node);
t.insert('I',node);
t.insert('J',node);
node = t.find('H');
t.insert('M',node);
//cout<<t.degree()<<endl;
for(t.begin();!t.end();t.next())
cout<<t.current()<<endl;
return 1;
结果:
以上是关于树的操作的主要内容,如果未能解决你的问题,请参考以下文章