您的位置:首页 > 其它

二叉树的基础问题

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;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐