二叉树的基础问题
2012-11-24 20:12
357 查看
先给定一个二叉树的图作为样例:
图中下边没有给出的表示为空,图画的不好,将就着看吧。
下面的代码中分别给出了二叉树的前中后的递归遍历和非递归遍历,最后还给出层次遍历。
#include<iostream>
#include<deque>
#include<stack>
using namespace std;
#define NIL '#'
typedef struct tree_node{
char data;
struct tree_node *lchild,*rchild;
}BiTNode,*BiTree;
void create_tree(BiTree *T) {
char ch;
scanf("%c", &ch);
if(ch == NIL){
*T = NULL;
} else {
*T = (BiTNode*)malloc(sizeof(BiTNode));
(*T)->data = ch;
create_tree(&(*T)->lchild);
create_tree(&(*T)->rchild);
}
}
void pre_order_traverse_recursive(BiTree T) { //前根递归遍历
if(T) {
cout << T->data << " ";
pre_order_traverse_recursive(T->lchild);
pre_order_traverse_recursive(T->rchild);
}
}
void pre_order_traverse_iterative(BiTree T) { //前根非递归遍历
stack<BiTNode *> m_stack;
m_stack.push(T);
BiTNode *p;
while(!m_stack.empty()) {
while((p = m_stack.top()) != NULL) {
cout << p->data << " ";
m_stack.push(p->lchild);
}
m_stack.pop();
if(!m_stack.empty()) {
p = m_stack.top();
m_stack.pop();
m_stack.push(p->rchild);
}
}
}
void in_order_traverse_recursive(BiTree T) { //中根递归遍历
if(T) {
in_order_traverse_recursive(T->lchild);
cout << T->data << " ";
in_order_traverse_recursive(T->rchild);
}
}
void in_order_traverse_iterative(BiTree T) { //中根非递归遍历
stack<BiTNode*> m_stack;
m_stack.push(T);
BiTNode *p;
while(!m_stack.empty()) {
while((p = m_stack.top()) != NULL)
m_stack.push(p->lchild);
m_stack.pop();
if(!m_stack.empty()) {
p = m_stack.top();
m_stack.pop();
cout << p->data << " ";
m_stack.push(p->rchild);
}
}
}
void post_order_traverse_recursive(BiTree T) { //后根递归遍历
if(T) {
post_order_traverse_recursive(T->lchild);
post_order_traverse_recursive(T->rchild);
cout << T->data << " ";
}
}
void post_order_traverse_iterative(BiTree T) { //后根非递归遍历
stack<BiTNode*> m_stack;
BiTNode *p;
BiTNode *r;
p = T;
while(p || !m_stack.empty()) {
if(p) {
m_stack.push(p);
p = p->lchild;
} else {
p = m_stack.top();
if(p->rchild && p->rchild != r) {
p = p->rchild;
m_stack.push(p);
p = p->lchild;
} else {
p = m_stack.top();
m_stack.pop();
cout << p->data << " ";
r = p;
p = NULL;
}
}
}
}
void horizontal_traverse(BiTree T) {
deque<BiTNode *> m_deque;
m_deque.push_back(T);
while(!m_deque.empty()) {
BiTNode *temp = m_deque.front();
m_deque.pop_front();
cout << temp->data << " ";
if(temp->lchild)
m_deque.push_back(temp->lchild);
if(temp->rchild)
m_deque.push_back(temp->rchild);
}
}
void main() {
BiTree T = NULL;
create_tree(&T);
//先根遍历
cout << "pre_order_traverse_recursive:";
pre_order_traverse_recursive(T);
cout << endl;
cout << "pre_order_traverse_iterative:";
pre_order_traverse_iterative(T);
cout << endl;
//中根遍历
cout << "in_order_traverse_recursive:";
in_order_traverse_recursive(T);
cout << endl;
cout << "in_order_traverse_iterative:";
in_order_traverse_iterative(T);
cout << endl;
//后根遍历
cout << "post_order_traverse_iterative:";
post_order_traverse_recursive(T);
cout << endl;
cout << "post_order_traverse_iterative:";
post_order_traverse_iterative(T);
cout << endl;
// 水平遍历
cout << "horizontal traverse:";
horizontal_traverse(T);
cout << endl;
}
图中下边没有给出的表示为空,图画的不好,将就着看吧。
下面的代码中分别给出了二叉树的前中后的递归遍历和非递归遍历,最后还给出层次遍历。
#include<iostream>
#include<deque>
#include<stack>
using namespace std;
#define NIL '#'
typedef struct tree_node{
char data;
struct tree_node *lchild,*rchild;
}BiTNode,*BiTree;
void create_tree(BiTree *T) {
char ch;
scanf("%c", &ch);
if(ch == NIL){
*T = NULL;
} else {
*T = (BiTNode*)malloc(sizeof(BiTNode));
(*T)->data = ch;
create_tree(&(*T)->lchild);
create_tree(&(*T)->rchild);
}
}
void pre_order_traverse_recursive(BiTree T) { //前根递归遍历
if(T) {
cout << T->data << " ";
pre_order_traverse_recursive(T->lchild);
pre_order_traverse_recursive(T->rchild);
}
}
void pre_order_traverse_iterative(BiTree T) { //前根非递归遍历
stack<BiTNode *> m_stack;
m_stack.push(T);
BiTNode *p;
while(!m_stack.empty()) {
while((p = m_stack.top()) != NULL) {
cout << p->data << " ";
m_stack.push(p->lchild);
}
m_stack.pop();
if(!m_stack.empty()) {
p = m_stack.top();
m_stack.pop();
m_stack.push(p->rchild);
}
}
}
void in_order_traverse_recursive(BiTree T) { //中根递归遍历
if(T) {
in_order_traverse_recursive(T->lchild);
cout << T->data << " ";
in_order_traverse_recursive(T->rchild);
}
}
void in_order_traverse_iterative(BiTree T) { //中根非递归遍历
stack<BiTNode*> m_stack;
m_stack.push(T);
BiTNode *p;
while(!m_stack.empty()) {
while((p = m_stack.top()) != NULL)
m_stack.push(p->lchild);
m_stack.pop();
if(!m_stack.empty()) {
p = m_stack.top();
m_stack.pop();
cout << p->data << " ";
m_stack.push(p->rchild);
}
}
}
void post_order_traverse_recursive(BiTree T) { //后根递归遍历
if(T) {
post_order_traverse_recursive(T->lchild);
post_order_traverse_recursive(T->rchild);
cout << T->data << " ";
}
}
void post_order_traverse_iterative(BiTree T) { //后根非递归遍历
stack<BiTNode*> m_stack;
BiTNode *p;
BiTNode *r;
p = T;
while(p || !m_stack.empty()) {
if(p) {
m_stack.push(p);
p = p->lchild;
} else {
p = m_stack.top();
if(p->rchild && p->rchild != r) {
p = p->rchild;
m_stack.push(p);
p = p->lchild;
} else {
p = m_stack.top();
m_stack.pop();
cout << p->data << " ";
r = p;
p = NULL;
}
}
}
}
void horizontal_traverse(BiTree T) {
deque<BiTNode *> m_deque;
m_deque.push_back(T);
while(!m_deque.empty()) {
BiTNode *temp = m_deque.front();
m_deque.pop_front();
cout << temp->data << " ";
if(temp->lchild)
m_deque.push_back(temp->lchild);
if(temp->rchild)
m_deque.push_back(temp->rchild);
}
}
void main() {
BiTree T = NULL;
create_tree(&T);
//先根遍历
cout << "pre_order_traverse_recursive:";
pre_order_traverse_recursive(T);
cout << endl;
cout << "pre_order_traverse_iterative:";
pre_order_traverse_iterative(T);
cout << endl;
//中根遍历
cout << "in_order_traverse_recursive:";
in_order_traverse_recursive(T);
cout << endl;
cout << "in_order_traverse_iterative:";
in_order_traverse_iterative(T);
cout << endl;
//后根遍历
cout << "post_order_traverse_iterative:";
post_order_traverse_recursive(T);
cout << endl;
cout << "post_order_traverse_iterative:";
post_order_traverse_iterative(T);
cout << endl;
// 水平遍历
cout << "horizontal traverse:";
horizontal_traverse(T);
cout << endl;
}
相关文章推荐
- 二叉树问题汇总(1)—基础问题
- 二叉树的建立于遍历 基础
- 嵌入式经典面试题-嵌入式程序员必须知道的0x10个基础问题
- Android基础:startActivityForResult 和 onActivityResult 问题
- 基础向:recyclerView 内嵌 edittext checkbox 焦点获取、数据紊乱以及数据保存问题
- 老生常谈JavaScript面向对象基础与this指向问题
- Atitit. 构造ast 语法树的总结attilax oao 1. Ast结构树形12. ast view (自是个160k的jar )22.1. 多条语句ast结构22.2. 变量定义 int b,c; 的ast结构22.3. 方法调用meth1(a=1,b=2,c=3); 的ast结构23. 误解的问题33.1. 语法书子能是个二叉树,实际上多叉树越好..33.2. 非要不个ast放到个s
- 【算法学习笔记】10.数据结构基础 二叉树初步练习3(遍历与递归复习)
- SQL基础(1)----union和like的合用出现的问题
- 【C# 基础】— 解决 "winForm 引用 Adobe PDF Reader控件不显示pdf 文件" 问题
- .NET基础知识问题汇总(持续更新中)
- Linux基础之Poechant问题解决与技巧集锦:Linux 查看文件里有多少行 wc命令
- 二叉树转双向链表问题
- 黑马程序员:Java基础——多线程之安全问题与同步
- 八皇后问题 - Python - from Python基础教程
- 2018/01/05Java基础学习——面试可能提的问题
- ASP.NET基础问题----使用随机字符串
- 关于基础架构的一些零碎问题的整理记录
- Java基础学习总结(61)——Java项目开发要注意的60个问题
- android定位已获取经纬度,上传google解析后textview不显示,基础问题,求大神解答~~>_<`