二叉树的遍历(递归实现)
二叉树的遍历(循环迭代实现)
普通树的遍历
准备工作:预处理命令 和 栈操作实现:
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef char elemtype;
typedef struct tNode * tree;
typedef struct tNode{
elemtype elem;
tree left;
tree right;
}tNode;
//用于遍历的栈结构
typedef struct node{
elemtype data;
struct node * next;
}LinkStackNode;
typedef LinkStackNode * LinkStack;
int isEmpty_Stack(LinkStack top)
{
if (top == NULL)
return TRUE;
else
return FALSE;
}
//栈的Push操作
void Push(LinkStack *top, elemtype x)
{
LinkStack tmp;
tmp = (LinkStackNode *)malloc(sizeof(LinkStackNode));
tmp -> data = x;
tmp -> next = *top;
*top = tmp;
}
// 栈的Pop操作
int Pop(LinkStack *top)
{
elemtype x;
if(top == NULL)
return FALSE;
LinkStack tmp;
tmp = *top;
// tmp = top -> next;
// top -> next = tmp -> next;
*top = tmp -> next;
x = tmp -> data;
free(tmp);
return x;
}
前序遍历
void preOrderTrav(tree t)
{
if(t) // t -> NULL 即为基线条件
{
printf("%c ", t -> elem);
preOrder(t -> left);
preOrder(t -> right);
}
}
void preOrderTrav_2(tree t)
{
tree T = t;
LinkStack top;
while(T || !isEmpty_Stack(top))
{
while(T)
{
printf("%c ", T -> elem);
Push(&top, T);
T = T -> left;
}
if(!isEmpty_Stack(top))
{
T = Pop(&top);
T = T ->right;
}
}
}
中序遍历
void inOrderTrav(tree t)
{
if (t == NULL)
return;
inOrder(t -> left);
printf("%c ", t -> elem);
inOrder(t -> right);
}
/*中序遍历非递归遍历算法
1,遇到一个节点,就压栈,并去遍历该节点的左子树;
2,当左子树遍历完后,弹出栈顶的这个树叶节点,并访问(打印一下)
3,进入该节点的右指针继续操作
*/
void inOrderTrav_2(tree t)
{
tree T = t;
LinkStack top;
while(T || !isEmpty_Stack(top))
{
while(T)
{
Push(&top, T);
T = T -> left;
}
if(!isEmpty_Stack(top))
{
T = Pop(&top);
printf("%c ", T -> elem);
T = T ->right;
}
}
}
后序遍历
void postOrderTrav(tree t)
{
if(t == NULL);
return;
postOrder(t -> left);
postOrder(t -> right);
printf("%c", t -> elem);
}
void postOrderTrav_2(tree t)
{
tree temp = NULL;
LinkStack top;
while(t || !isEmpty_Stack(top))
{
while(t)
{
Push(&top, t);
t = t -> left;
}
if(!isEmpty_Stack(top))
{
t = Pop(&top);
if((t -> right == NULL) || ((t -> right == temp)) )
{
//t = t ->right;
printf("%c ", t -> elem);
temp = t;
t = NULL;
}
else
{
Push(&top, t);
t = t -> right;
}
}
}
}
C++普通树遍历
#include<iostream>
#include<vector>
#include<queue>
#include<initializeer_list>
using namespace std;
struct Node{
int data;
vector<Node*> children;
Node(int x = 0){data = x;}
void setNode(initializer_list<Node*> il){
for(Node* x : il)
children.push_back(x);
}
}
//先序
void preOrder(Node* root){
if(root -> NULL) return;
cout<< root->data << " ";
for(Node* x : root->child)
preOrder(x);
}
//后序
void postOrder(Node* root){
if(root -> NULL) return;
for(Node* x : root->child)
postOrder(x);
cout<< root->data << " ";
}