二叉树先序遍历(包含递归和非递归(2种方法))
来源:互联网 发布:cpu故障检测软件 编辑:程序博客网 时间:2024/06/07 06:36
二叉树先序遍历:中 左 右
二叉树中序遍历: 左 中 右
二叉树后序遍历: 左 右 中
本文以二叉树的先序遍历为例,讲解递归和非递归两种方法求解。
首先给出二叉树节点的结构
struct Node {
int value;
Node left;
Node right;
Node(int x) {this.value = x;}
};
例:二叉树如图所示
1
/ \
2 3
/ \ / \
4 5 6 7
1. 递归求解方法比较简单如下所示:
打印二叉树的先序遍历结果
void PreOrder(Node head) {
std::cout<<head.value<<" ";
PreOrder(head.left);//递归打印左子树
PreOrder(head.right);//递归打印右子树
}
2.非递归求解
(1). 使用stack来实现。首先将head压入栈,每次将栈顶元素弹出,记为cur,打印cur的值。然后,如果右节点不为空,将cur的右节点压入栈,如果左节点不为空,将其左节点压入栈,当栈为空时循环结束! 本方法是在出栈的时候实现打印输出。
void preOrder(Node head) {
stack<Node> s;
s.push(head);
while(!s.empty()) {
Node temp = s.top();
s.pop();
std::cout<<temp.value<<std::endl;
if( temp.right) s.push(temp.right);
if( temp.left) s.push(temp.left);
}
}
(2). 还是使用stack.不过这个稍微不同,是先将所有的最左节点入栈,例如1,2,4先入栈,然后将栈顶元素弹出,并记为cur,如果cur的右节点不为空,则将右节点入栈,并循环将右节点的左子节点入栈。此方法是入栈时打印输出节点值。此方法依据先序遍历 1 2 4 5 3 6 7的顺序,依次入栈。
void preOrder(Node head) {
stack<Node> s;
while(head) {
s.push(head);
std::cout<<head.value<<std::endl;
head = head.left;
}
while(!s.empty()) {
Node temp = s.top().right;
s.pop();
while (temp) {
s.push(temp);
std::cout<<temp.value<<std::endl;
temp = temp.left;
}
}
}
- 二叉树先序遍历(包含递归和非递归(2种方法))
- 二叉树的三种遍历方法(递归和非递归)(转载)
- 二叉树的三种遍历方法(递归和非递归)(转载)
- 二叉树的三种遍历方法(递归和非递归)(转载)
- 二叉树的三种遍历方法(递归和非递归)
- 数据结构-二叉树(包含递归和非递归版本)
- 遍历二叉树的全部方法(递归+非递归)
- 二叉树遍历(递归,非递归)
- 二叉树中序遍历(递归+非递归)
- 树(二)二叉树递归和非递归遍历
- 二叉树遍历(递归算法和非递归算法)
- 二叉树遍历(递归和非递归)
- 二叉树遍历(递归和非递归)及应用
- 二叉树的遍历(递归和非递归)
- 数据结构之二叉树遍历(递归和非递归)
- 二叉树的遍历(递归和非递归)
- 二叉树的建立和遍历(递归、非递归)
- 二叉树的遍历(非递归和递归实现)
- Collections类方法
- B树、B+树
- linux ./configure 的参数详解
- 【Django】-- django.db.migrations.exceptions.InconsistentMigrationHistory
- onCreateView 与onActivityCreated 的区别
- 二叉树先序遍历(包含递归和非递归(2种方法))
- selectionSort
- 【数据结构基础】选择排序法
- ubuntu系统安装deb格式的软件(以lantern为例)
- linux系统中如何进入退出vim编辑器,方法及区别
- shell中输入重定向,输出重定向,管道
- 推荐系统之基于用户的协调过滤
- Shiro 学习笔记(2)—— Jdbc Realm
- error LNK2019解决方法