C语言数据结构“遍历二叉树”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言数据结构“遍历二叉树”相关的知识,希望对你有一定的参考价值。

遍历二叉树。
请输入一棵二叉树的扩展的前序序列,经过处理后生成一棵二叉树,然后对于该二叉树输出前序、中序和后序遍历序列。

[答案]:

//////////////////////////////////////////////////
使用方法:
输入树的节点,输入0结束
1 2 3 4 5 6 7 8 9 0

中序打印
1->2->3->4->5->6->7->8->9->
后序打印
9->8->7->6->5->4->3->2->1->
前序打印
1->2->3->4->5->6->7->8->9->

程序原码:
//////////////////////////////////////////////////

#include<stdlib.h>
#include<stdio.h>

typedef struct tree

struct tree *left;
int date;
struct tree *right;
treenode,*b_tree;
///////按顺序插入节点/////////////////////

b_tree insert(b_tree root,int node)

b_tree newnode;
b_tree currentnode;
b_tree parentnode;

newnode=(b_tree)malloc(sizeof(treenode));

newnode->date=node;
newnode->right=NULL;
newnode->left=NULL;

if(root==NULL)
return newnode;
else

currentnode=root;
while(currentnode!=NULL)

parentnode=currentnode;
if(currentnode->date>node)
currentnode=currentnode->left;
else
currentnode=currentnode->right;

if(parentnode->date>node)
parentnode->left=newnode;
else
parentnode->right=newnode;

return root;


//////建立树///////////////////
b_tree creat(int *date,int len)

b_tree root=NULL;
int i;
for(i=0;i<len;i++)
root=insert(root,date[i]);
return root;


//////中序打印////////////////
void print1(b_tree root)
if(root!=NULL)

print1(root->left);
printf("%d->",root->date);
print1(root->right);



//////后序打印////////////////
void print2(b_tree root)
if(root!=NULL)

print2(root->left);
print2(root->right);
printf("%d->",root->date);



//////前序打印////////////////
void print3(b_tree root)
if(root!=NULL)
printf("%d->",root->date);
print3(root->left);
print3(root->right);




///////测试函数//////////////////
void main()

b_tree root=NULL;
int i,index;
int value;
int nodelist[20];

printf("输入树的节点,输入0结束\n");
index=0;
scanf("%d",value);
while(value!=0)

nodelist[index]=value;
index=index+1;
scanf("%d",value);

root=creat(nodelist,index);
printf("\n中序打印\n");
print1(root);
printf("\n后序打印\n");
print2(root);
printf("\n前序打印\n");
print3(root);


悉雨辰寂
参考技术A 层次遍历应该没有递归算法
递归实际就是一种深度优先的算法
而层次遍历实际是广度优先的遍历算法,所以递归不适用
比如假设有递归算法,现遍历i层的开始,对i层第一个元素遍历后需调用递归函数遍历其孩子,递归调用完成后才继续遍历i层第二个元素,这样就不是层次遍历了

二叉树的建立及基本操作

实验要求:
用C语言编程实现二叉树的基本操作,并完成下述函数功能:
(1) CreateBiTree( ):根据先序遍历序列生成一棵二叉树
(2) CountLeaf( ):统计该二叉树中叶子结点的个数
(3) InOrderTraverse( ):中序遍历二叉树
(4) PostOrderTraverse( ):后序遍历二叉树
在主函数main( )中调用各个子函数完成二叉树的基本操作。
[实现提示]
采用特殊符号,如*号表示空树的情况。
通过输入扩展的先序序列建立一棵二叉树。
[测试数据]
由学生自己确定,注意边界数据。
程序检查时,由老师提供用于建树的初始输入序列。

楼主你好
具体代码如下:
#include<stdio.h>
#include<stdlib.h>
#define MAX 40

typedef struct node//二叉树结点定义

char data;
struct node *lChild;//左孩子
struct node *rChild;//右孩子
BTNode;

//*************************************二叉树操作***************************************

void Initial_BT(BTNode * &b)

b=NULL;


void Creat_BT(BTNode * &b)//创建二叉树

BTNode *St[MAX];//用栈辅助实现二叉树的建立
BTNode *p=NULL;
b=NULL;
int top=-1;//栈指针
int k;//k为左右孩子标示(1为左孩子、2为右孩子)
char ch;
printf("Enter the binary tree:\n");
ch=getchar();
while(ch!='\n')

switch(ch)

case '('://左孩子
top++;
St[top]=p;
k=1;
break;
case ')':
top--;
break;
case ','://右孩子
k=2;
break;
default:
p=(BTNode *)malloc(sizeof(BTNode));
p->data=ch;
p->lChild=p->rChild=NULL;
if(!b)//如果为根节点
b=p;
else

switch(k)

case 1:
St[top]->lChild=p;
break;
case 2:
St[top]->rChild=p;
break;



ch=getchar();//继续读入数据



void InOrder(BTNode *b)//中序遍历

if(b)

InOrder(b->lChild);
printf("%c",b->data);
InOrder(b->rChild);



void PostOrder(BTNode *b)//后序遍历

if(b)

PostOrder(b->lChild);
PostOrder(b->rChild);
printf("%c",b->data);



int Leaf_Sum(BTNode *b)

if(!b)
return 0;
else if(b->lChild == NULL && b->rChild == NULL)
return 1;
else
return Leaf_Sum(b->lChild)+Leaf_Sum(b->rChild);


void Start()

BTNode *b;//二叉树
char choice;
b=(BTNode *)malloc(sizeof(BTNode));
Initial_BT(b);

GOTO:system("cls");
printf("\t\t1.创建二叉树.\n"
"\t\t2.中序遍历.\n"
"\t\t3.后序遍历.\n"
"\t\t4.叶子结点个数.\n"
"\t\t5.退出.\n");
printf("输入你的选择:");
GOTO1:choice=getchar();

switch(choice)

case '1':
getchar();
Creat_BT(b);
system("pause");
goto GOTO;
case '2':
InOrder(b);
printf("\n");
system("pause");
getchar();
goto GOTO;
case '3':
PostOrder(b);
printf("\n");
system("pause");
getchar();
goto GOTO;
case '4':
printf("共有%d个叶子结点\n",Leaf_Sum(b));
system("pause");
getchar();
goto GOTO;
case '5':
system("pause");
break;
default:
printf("输入错误!\n"
"重新输入:");
goto GOTO1;



int main()

Start();
return 0;


希望能帮助你哈
参考技术A #include<stdio.h>
#include<malloc.h>
typedef char DataType;
typedef struct BTNode

DataType data;
struct BTNode * lchild;
struct BTNode * rchild;
BTNode,*BiTree;
void CreateBiTree(BiTree *T)

DataType ch;
scanf("%c",&ch);
if(ch=='#')
*T=NULL;
else

*T=(BiTree)malloc(sizeof(BTNode));
if(!(*T))
exit(-1);
(*T)->data=ch;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));


void preorder(BTNode *bt)

if(bt==NULL)
return;
else

printf("%c",bt->data);
preorder(bt->lchild);
preorder(bt->rchild);


void inorder(BTNode *bt)

if(bt==NULL)
return;
else

inorder(bt->lchild);
printf("%c",bt->data);
inorder(bt->rchild);


void postorder(BTNode *bt)

if(bt==NULL)
return;
else

postorder(bt->lchild);
postorder(bt->rchild);
printf("%c",bt->data);


void mian()

BiTree *T=NULL;
CreateBiTree(T);
printf("先序遍历结果为:");
preorder(*T);
printf("中序遍历结果为:");
inorder(*T);
printf("后序遍历结果为:");
postorder(*T);

以上是关于C语言数据结构“遍历二叉树”的主要内容,如果未能解决你的问题,请参考以下文章

二叉树遍历算法总结

二叉树的创建和遍历

二叉树的前中后遍历以及层序遍历操作(C语言)

数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树

《数据结构》遍历二叉树的非递归算法的疑问。

数据结构C语言 《四》二叉树链式的实现及操作《下》