二叉树的遍历,递归和非递归,求深度
来源:互联网 发布:sql查询分析器如何建表 编辑:程序博客网 时间:2024/05/08 02:36
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX 100
#define type char
typedef struct node{
type date;
struct node *right,*left;
}TreeNode,*pTreeNode;
typedef struct Linknode
{
pTreeNode ptn;
struct Linknode * next;
}LinkNode,*LiStack;
void PreOrder(pTreeNode T);
void PreOrder_no2(pTreeNode T);
void InOrder(pTreeNode T);
void InOrder_no2(pTreeNode t);//
void PostOrder(pTreeNode T);
void PostOrder_no2(pTreeNode t);//非递归算法
int Depth(pTreeNode T);
pTreeNode CreatTree();
int main()
{
// printf("Hello world!\n");
printf(" a\n\n");
printf(" b c\n\n");
printf(" d e\n\n");
TreeNode tree[5] ;
tree[0].date = 'A';
tree[1].date = 'B';
tree[2].date = 'c';
tree[3].date = 'd';
tree[4].date = 'e';
tree[0].left = &tree[1];
tree[0].right = &tree[2];
tree[1].left = NULL;
tree[1].right = &tree[3];
tree[2].left = &tree[4];
tree[2].right = NULL;
tree[3].left = NULL;
tree[3].right = NULL;
tree[4].left = NULL;
tree[4].right = NULL;
// tree = CreatTree();
printf("PreOrder:");
PreOrder_no2(tree);
printf("\n");
printf("InOrder:");
InOrder_no2(tree);
// InOrder(tree);
// printf("\n");
printf("PostOrder:");
PostOrder_no2(tree);
// printf("\n");
// printf("the depth of tree:%d",Depth(tree));
return 0;
}
int Depth(pTreeNode T)
{
int dl,dr,max;
// max = 0;
if(NULL != T)
{
dl = Depth(T->left);
dr = Depth(T->right);
max = dl>dr?dl:dr;
return (max+1);
}else
{
return 0;
}
}
void PostOrder(pTreeNode T)
{
if(NULL != T)
{
if(NULL != T->right)
PostOrder(T->right);
printf("%c\t",T->date);
if(NULL != T->left)
PostOrder(T->left);
}
}
//写栈的代码,是关于指针的,不能使用!
void InitStack(LiStack S)
{
S = NULL;
}
bool IsEmpty(LiStack s)
{
return (s==NULL);
}
void Push(LiStack s,pTreeNode * pt)
{
LiStack p = (LiStack)malloc( sizeof(LinkNode));
p->ptn = *pt;
p->next = s;
s = p;
}
bool Pop(LiStack s,pTreeNode * pt)
{
LiStack p;
if(NULL == s) return false;
else{
p= s;
*pt = p->ptn;
s=s->next;
free(p);
return true;
}
{
LiStack S;
InitStack(S);//初始化堆栈
pTreeNode p = t ;
while(p || !IsEmpty(S))//节点不为空或者栈为不为空,都将继续循环
{
if(p)
{
Push(S,&p);//将根节点入栈
p = p->left;//再将左子树入栈
}
else
{
Pop(S,&p);//将指针退栈,访问根节点,遍历右子数
printf("%c ",p->date);
p = p->right;
}
}
}
void PreOrder_no2(pTreeNode t)
{
pTreeNode ptn[MAX];
int top = -1;
pTreeNode p = t;
while(p || (-1 != top))
{
if(p)
{
printf("%c ",p->date);
ptn[++top] = p;//将根节点入栈
p = p->left;//将左节点入栈
}else
{
p = ptn[top--];//出栈
p = p->right;
}
}
}
/**********************************************/
/**
后序遍历的非递归算法很精彩,有点难以理解
但是非常漂亮。
***********************************************/
void PostOrder_no2(pTreeNode t)
{
pTreeNode ptn[MAX];
int tag[MAX];//这个很重要的。
int top = -1;
pTreeNode p = t;
while(p || (-1 != top))
{
while(p)//将根节点和左子树全部入栈
{
ptn[++top] = p;//将根节点入栈
tag[top] = 0;//
p = p->left;//将左节点入栈
}
while(top != -1 && tag[top]== 1)//打印出栈的序列
{
p = ptn[top--];//出栈
printf("%c ",p->date);
}
if(top != -1)
{
tag[top]=1;
p = ptn[top]->right;
}
else break;
}
}
void InOrder_no2(pTreeNode t)//中序遍历,非递归算法
{
pTreeNode ptn[MAX];//初始化栈
int top = -1;
pTreeNode p = t;
while(p || (-1 != top))
{
if(p)
{
ptn[++top] = p;//将根节点入栈
p = p->left;//将左节点入栈
}else
{
p = ptn[top--];//出栈
printf("%c ",p->date);//
p = p->right;
}
}
}
void InOrder(pTreeNode T)
{
if(NULL != T)
{
if(NULL != T->left)
InOrder(T->left);
printf("%c\t",T->date);
if(NULL != T->right)
InOrder(T->right);
}
}
pTreeNode CreatTree()
{
pTreeNode T;
type ch;
printf("please input the character :\n");
scanf("%c",&ch);
// ch = getchar();
fflush(stdin);//必须注意刷新缓冲区,才行
if('#'== ch) T = NULL;
else
{
T =(pTreeNode)malloc(sizeof(TreeNode));
T->date = ch;
printf("left node:\n");
T->left = CreatTree();
printf("right node:\n");
T->right = CreatTree();
}
return T;
}
void PreOrder(pTreeNode T)
{
if(NULL != T)
{
printf("%c",T->date);
if(NULL != T->left)
PreOrder(T->left);
if(NULL != T->right)
PreOrder(T->right);
}
}
#include <stdlib.h>
#include <stdbool.h>
#define MAX 100
#define type char
typedef struct node{
type date;
struct node *right,*left;
}TreeNode,*pTreeNode;
typedef struct Linknode
{
pTreeNode ptn;
struct Linknode * next;
}LinkNode,*LiStack;
void PreOrder(pTreeNode T);
void PreOrder_no2(pTreeNode T);
void InOrder(pTreeNode T);
void InOrder_no2(pTreeNode t);//
void PostOrder(pTreeNode T);
void PostOrder_no2(pTreeNode t);//非递归算法
int Depth(pTreeNode T);
pTreeNode CreatTree();
int main()
{
// printf("Hello world!\n");
printf(" a\n\n");
printf(" b c\n\n");
printf(" d e\n\n");
TreeNode tree[5] ;
tree[0].date = 'A';
tree[1].date = 'B';
tree[2].date = 'c';
tree[3].date = 'd';
tree[4].date = 'e';
tree[0].left = &tree[1];
tree[0].right = &tree[2];
tree[1].left = NULL;
tree[1].right = &tree[3];
tree[2].left = &tree[4];
tree[2].right = NULL;
tree[3].left = NULL;
tree[3].right = NULL;
tree[4].left = NULL;
tree[4].right = NULL;
// tree = CreatTree();
printf("PreOrder:");
PreOrder_no2(tree);
printf("\n");
printf("InOrder:");
InOrder_no2(tree);
// InOrder(tree);
// printf("\n");
printf("PostOrder:");
PostOrder_no2(tree);
// printf("\n");
// printf("the depth of tree:%d",Depth(tree));
return 0;
}
int Depth(pTreeNode T)
{
int dl,dr,max;
// max = 0;
if(NULL != T)
{
dl = Depth(T->left);
dr = Depth(T->right);
max = dl>dr?dl:dr;
return (max+1);
}else
{
return 0;
}
}
void PostOrder(pTreeNode T)
{
if(NULL != T)
{
if(NULL != T->right)
PostOrder(T->right);
printf("%c\t",T->date);
if(NULL != T->left)
PostOrder(T->left);
}
}
//写栈的代码,是关于指针的,不能使用!
void InitStack(LiStack S)
{
S = NULL;
}
bool IsEmpty(LiStack s)
{
return (s==NULL);
}
void Push(LiStack s,pTreeNode * pt)
{
LiStack p = (LiStack)malloc( sizeof(LinkNode));
p->ptn = *pt;
p->next = s;
s = p;
}
bool Pop(LiStack s,pTreeNode * pt)
{
LiStack p;
if(NULL == s) return false;
else{
p= s;
*pt = p->ptn;
s=s->next;
free(p);
return true;
}
}
{
LiStack S;
InitStack(S);//初始化堆栈
pTreeNode p = t ;
while(p || !IsEmpty(S))//节点不为空或者栈为不为空,都将继续循环
{
if(p)
{
Push(S,&p);//将根节点入栈
p = p->left;//再将左子树入栈
}
else
{
Pop(S,&p);//将指针退栈,访问根节点,遍历右子数
printf("%c ",p->date);
p = p->right;
}
}
}
void PreOrder_no2(pTreeNode t)
{
pTreeNode ptn[MAX];
int top = -1;
pTreeNode p = t;
while(p || (-1 != top))
{
if(p)
{
printf("%c ",p->date);
ptn[++top] = p;//将根节点入栈
p = p->left;//将左节点入栈
}else
{
p = ptn[top--];//出栈
p = p->right;
}
}
}
/**********************************************/
/**
后序遍历的非递归算法很精彩,有点难以理解
但是非常漂亮。
***********************************************/
void PostOrder_no2(pTreeNode t)
{
pTreeNode ptn[MAX];
int tag[MAX];//这个很重要的。
int top = -1;
pTreeNode p = t;
while(p || (-1 != top))
{
while(p)//将根节点和左子树全部入栈
{
ptn[++top] = p;//将根节点入栈
tag[top] = 0;//
p = p->left;//将左节点入栈
}
while(top != -1 && tag[top]== 1)//打印出栈的序列
{
p = ptn[top--];//出栈
printf("%c ",p->date);
}
if(top != -1)
{
tag[top]=1;
p = ptn[top]->right;
}
else break;
}
}
void InOrder_no2(pTreeNode t)//中序遍历,非递归算法
{
pTreeNode ptn[MAX];//初始化栈
int top = -1;
pTreeNode p = t;
while(p || (-1 != top))
{
if(p)
{
ptn[++top] = p;//将根节点入栈
p = p->left;//将左节点入栈
}else
{
p = ptn[top--];//出栈
printf("%c ",p->date);//
p = p->right;
}
}
}
void InOrder(pTreeNode T)
{
if(NULL != T)
{
if(NULL != T->left)
InOrder(T->left);
printf("%c\t",T->date);
if(NULL != T->right)
InOrder(T->right);
}
}
pTreeNode CreatTree()
{
pTreeNode T;
type ch;
printf("please input the character :\n");
scanf("%c",&ch);
// ch = getchar();
fflush(stdin);//必须注意刷新缓冲区,才行
if('#'== ch) T = NULL;
else
{
T =(pTreeNode)malloc(sizeof(TreeNode));
T->date = ch;
printf("left node:\n");
T->left = CreatTree();
printf("right node:\n");
T->right = CreatTree();
}
return T;
}
void PreOrder(pTreeNode T)
{
if(NULL != T)
{
printf("%c",T->date);
if(NULL != T->left)
PreOrder(T->left);
if(NULL != T->right)
PreOrder(T->right);
}
}
0 0
- 二叉树的遍历,递归和非递归,求深度
- 求二叉树深度的递归和非递归算法
- 二叉树的非递归遍历&求深度
- 二叉树的基本操作(创建、递归和非递归遍历、求深度、求叶子数)
- 非递归求二叉树的深度
- 二叉树的操作 深度广度遍历,二叉树递归和非递归遍历
- 二叉树的操作 深度广度遍历,二叉树递归和非递归遍历
- 二叉树的遍历与求深度的递归与非递归实现
- 二叉树递归、非递归求深度
- C++ 实现求二叉树的深度及遍历(递归与非递归算法)
- 求二叉树深度 -- 递归和非递归实现
- 二叉树的深度遍历---递归&非递归
- 求二叉树的深度,递归与非递归算法
- 求二叉树的深度递归与非递归版
- 求二叉树的深度 递归 非递归
- 二叉树的递归遍历和非递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉搜索树的递归遍历和非递归遍历
- uva-216 - Getting in Line
- Java学习笔记6:覆盖equals时总是要覆盖hashCode
- B. 沙漠之旅(分组背包)
- 应聘互联网公司的简历应该是怎么样的?
- C. Adidas vs Adivon
- 二叉树的遍历,递归和非递归,求深度
- equals() 和 '=='
- H. 硬币水题II
- linux学习之二---gcc与g++
- Java学习笔记8:覆盖equals时总是要覆盖hashCode
- 旋转数组的最小数字
- JAVA学习第二十二课(多线程(二))- (多线程的创建方式一 :继承Thread类)
- fft 学习
- 常用ARM汇编指令及ATPCS规则