二叉树的简单操作:
//可以输入ABC##DE#G##F###
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MAX 20
typedef struct BTNode{ /*节点结构声明*/
char data ; /*节点数据*/
struct BTNode *lchild;
struct BTNode *rchild ; /*指针*/
}*BiTree;
void createBiTree(BiTree *t){ /* 先序遍历创建二叉树*/
char s;
BiTree q;
printf("\nplease input data:(exit for #)");
s=getchar();
if(s=='#'){*t=NULL; return;}
q=(BiTree)malloc(sizeof(struct BTNode));
if(q==NULL){printf("Memory alloc failure!"); exit(0);}
q->data=s;
*t=q;
createBiTree(&q->lchild); /*递归建立左子树*/
createBiTree(&q->rchild); /*递归建立右子树*/
}
void PreOrder(BiTree p){ /* 先序遍历二叉树*/
if ( p!= NULL ) {
printf("%c", p->data);
PreOrder( p->lchild ) ;
PreOrder( p->rchild) ;
}
}
void InOrder(BiTree p){ /* 中序遍历二叉树*/
if( p!= NULL ) {
InOrder( p->lchild ) ;
printf("%c", p->data);
InOrder( p->rchild) ;
}
}
void PostOrder(BiTree p){ /* 后序遍历二叉树*/
if ( p!= NULL ) {
PostOrder( p->lchild ) ;
PostOrder( p->rchild) ;
printf("%c", p->data);
}
}
void Preorder_n(BiTree p){ /*先序遍历的非递归算法*/
BiTree stack[MAX],q;
int top=0,i;
for(i=0;i<MAX;i++) stack[i]=NULL;/*初始化栈*/
q=p;
while(q!=NULL){
printf("%c",q->data);
if(q->rchild!=NULL) stack[top++]=q->rchild;
if(q->lchild!=NULL) q=q->lchild;
else
if(top>0) q=stack[--top];
else q=NULL;
}
}
void release(BiTree t){ /*释放二叉树空间*/
if(t!=NULL){
release(t->lchild);
release(t->rchild);
free(t);
}
}
int Depth(BiTree t)
{
int m,n;
if(t==NULL) return 0;
else
{
m=Depth(t->lchild);
n=Depth(t->rchild);
if(m>n) return(m+1);
else return(n+1);
}
}
int NodeCount(BiTree t)
{
if(t==NULL)
return 0;
else
return NodeCount(t->lchild)+NodeCount(t->rchild)+1;
}
int leaf_num(BiTree t)
{
if (t == NULL)
return 0;
if (t->lchild == NULL && t->rchild == NULL)
return 1;
return (leaf_num(t->lchild) + leaf_num(t->rchild));
}
int main(){
BiTree t=NULL;
createBiTree(&t);
printf("\n\n先序遍历二叉树为:");
PreOrder(t);
printf("\n\n中序遍历二叉树为:");
InOrder(t);
printf("\n\n后序遍历二叉树为:");
PostOrder(t);
printf("\n\n先序遍历序列(非递归):");
Preorder_n(t);
printf("\n\n二叉树深度: ");
printf("%d\n",Depth(t));
printf("\n结点总数为: ");
printf("%d\n",NodeCount(t));
printf("\n叶子结点总数: ");
printf("%d\n",leaf_num(t));
release(t);
return 0;
}
简单二叉树遍历:
比如这个
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node *left;
struct node *right;
};
typedef struct node Node;
void PreOrder(Node *node) { //先序
if (node != NULL) {
printf("%d\n", node -> data);
PreOrder(node -> left);
PreOrder(node -> right);
}
}
void InOrder(Node *node) {//中序
if (node != NULL) {
InOrder(node -> left);
printf("%d\n", node -> data);
InOrder(node -> right);
}
}
void PostOrder(Node *node) {//后序
if (node != NULL) {
PostOrder(node -> left);
PostOrder(node -> right);
printf("%d\n", node -> data);
}
}
int main() {
Node n1;
Node n2;
Node n3;
Node n4;
n1.data = 5;
n2.data = 6;
n3.data = 7;
n4.data = 8;
n1.left = &n2;
n1.right = &n3;
n2.left = &n4;
n2.right = NULL;
n3.left = NULL;
n3.right = NULL;
n4.left = NULL;
n4.right = NULL;
PreOrder(&n1);//先序
// InOrder(&n1);//中序
// PostOrder(&n1);//后序
return 0;
}