左孩子右兄弟树的递归与非递归、深度与广度遍历
2015-08-10 22:52
309 查看
http://blog.chinaunix.net/uid-21712186-id-1818095.html
左孩子右兄弟存储方式:
struct tree_node
{
int data;
tree_node* first_child;
tree_node* sibling;
}
一个观念必须要有: root没有兄弟sibling,根是独立的,代表这一棵树---------忘记了绝不会写递归了。
(A) 深度遍历:
(1)递归算法:
先根遍历 void preOrder(tree_node * root)
{
if (!root)
return;
printf(root->data);
tree_node* p;
for(p=root->first_child;p,p=p->sibling)
{
preOrder(p);
}
}
后根遍历 void postOrder(tree_node * root)
{
if (!root)
return;
tree_node* p;
for(p=root->first_child;p,p=p->sibling)
{
preOrder(p);
}
printf(root->data);
}
(2)非递归算法:
记忆技巧是将节点看成是二叉树,因为树对应的二叉树的
先序与树的先根遍历序列是一致的,这是公认的事实。
先根遍历 void preOrder(tree_node* root)
{
stack sk;
while(root || !sk.empty())
{
while(root)
{
printf(root->data);
sk.push(root);
root=root->first_child;
}
root=sk.top(); sk.pop();//STL要求这样做的
root=root->sibling; //root可以为空的
}
}
记忆技巧是将节点看成是二叉树,因为树对应的二叉树的
中序与树的后根遍历序列是一致的,这是公认的事实。
后根遍历 void postOrder(tree_node* root)
{
stack sk;
while(root || !sk.empty())
{
while(root)
{
sk.push(root);
root=root->first_child;
}
root=sk.top();sk.pop();//STL要求这样做的
printf(root->data);
root=root->sibling;//root可以为空的
}
}
(B)广度遍历(按层次次序遍历树的算法)
用队列实现
void levelOrde(tree_node* root)
{
queue q;
q.push(root);
while(!q.empty())
{
root=q.font();q.pop();
printf(root->data);
root=root->first_child;
while(!root)
{
q.push(root);
root=root->sibling;
}
}
}
左孩子右兄弟存储方式:
struct tree_node
{
int data;
tree_node* first_child;
tree_node* sibling;
}
一个观念必须要有: root没有兄弟sibling,根是独立的,代表这一棵树---------忘记了绝不会写递归了。
(A) 深度遍历:
(1)递归算法:
先根遍历 void preOrder(tree_node * root)
{
if (!root)
return;
printf(root->data);
tree_node* p;
for(p=root->first_child;p,p=p->sibling)
{
preOrder(p);
}
}
后根遍历 void postOrder(tree_node * root)
{
if (!root)
return;
tree_node* p;
for(p=root->first_child;p,p=p->sibling)
{
preOrder(p);
}
printf(root->data);
}
(2)非递归算法:
记忆技巧是将节点看成是二叉树,因为树对应的二叉树的
先序与树的先根遍历序列是一致的,这是公认的事实。
先根遍历 void preOrder(tree_node* root)
{
stack sk;
while(root || !sk.empty())
{
while(root)
{
printf(root->data);
sk.push(root);
root=root->first_child;
}
root=sk.top(); sk.pop();//STL要求这样做的
root=root->sibling; //root可以为空的
}
}
记忆技巧是将节点看成是二叉树,因为树对应的二叉树的
中序与树的后根遍历序列是一致的,这是公认的事实。
后根遍历 void postOrder(tree_node* root)
{
stack sk;
while(root || !sk.empty())
{
while(root)
{
sk.push(root);
root=root->first_child;
}
root=sk.top();sk.pop();//STL要求这样做的
printf(root->data);
root=root->sibling;//root可以为空的
}
}
(B)广度遍历(按层次次序遍历树的算法)
用队列实现
void levelOrde(tree_node* root)
{
queue q;
q.push(root);
while(!q.empty())
{
root=q.font();q.pop();
printf(root->data);
root=root->first_child;
while(!root)
{
q.push(root);
root=root->sibling;
}
}
}
相关文章推荐
- 15-05-常用对象API(String类-常见功能-转换)
- hdu 5357
- hdu 5357 2015-08-10 22:52 7人阅读 评论(0) 收藏
- spring 注解注入方式
- Linux开关机相关命令
- mysql主从复制
- Mybatis学习笔记-一级缓存
- 计算输入的一串数字中奇数的乘机
- 使用 Velocity 模板引擎快速生成代码
- Linux多线程编程小结
- C++ 中 struct和class 的区别
- 递归与尾递归
- 表单防止重复提交
- 红黑树的插入与删除
- hdoj 1686 Oulipo
- 关于屏幕适配的理解(大牛可忽略)
- Linux多任务编程 编写多进程程序及其代码
- scala学习:scala中的模式匹配入门实战
- MySQL常用命令
- 最近在开发一个文章聚合的工具