数据结构之二叉树
二叉树遍历有先序遍历、中序遍历、后序遍历。下面有递归和非递归的方式:
#include "Status.h" #include <malloc.h> typedef struct BiTNode { TElemType data; struct BiTNode *LChild, *RChild; }BiTNode, *BiTree; typedef BiTree SElemType; #include "SqStack.h" void inputTElem(TElemType &e); Status isEmptyElem(TElemType e); void createBiTree(BiTree &T) { TElemType e; inputTElem(e); if(isEmptyElem(e)) T=NULL; else{ T=(BiTree)malloc(sizeof(BiTNode)); T->data = e; createBiTree(T->LChild); createBiTree(T->RChild); } } void PreOrderTraverse( BiTree T, void (*visit)(TElemType &e) ){ if(T){ visit(T->data); PreOrderTraverse(T->LChild, visit); PreOrderTraverse(T->RChild, visit); } } void InOrderTraverse ( BiTree T, void (*visit)(TElemType &e) ) { if(T){ InOrderTraverse(T->LChild, visit); visit(T->data); InOrderTraverse(T->RChild, visit); } } void PostOrderTraverse (BiTree T, void (*visit)(TElemType &e)) { if(T){ PostOrderTraverse(T->LChild, visit); PostOrderTraverse(T->RChild, visit); visit(T->data); } } int countLeaf(BiTree T){ int countLeft, countRight; if(!T) return 0; if(T->LChild==NULL&&T->RChild==NULL) return 1; countLeft = countLeaf(T->LChild); countRight = countLeaf(T->RChild); return countLeft+countRight; } int depthBiTree(BiTree T ){ int depthLeft, depthRight; if(!T) return 0; else{ depthLeft = depthBiTree(T->LChild); depthRight = depthBiTree(T->RChild); if(depthLeft >= depthRight) return depthLeft+1; else return depthRight+1; } } void PreOrderTraverse_N(BiTree T, void (*visit)(TElemType &e)){ SqStack S; InitSqStack(S, 100); BiTNode *p=T; while(p||!stackIsEmpty(S)){ if(p){ visit(p->data); Push(S, p); p=p->LChild; }else{ Pop(S, p); p=p->RChild; } } } void InOrderTraverse_N(BiTree T, void(*visit)(TElemType &e)){ SqStack S; InitSqStack(S, 100); BiTNode *p=T; while(p||!stackIsEmpty(S)){ if(p){ Push(S, p); p=p->LChild; }else{ Pop(S, p); visit(p->data); p=p->RChild; } } } // main函数 #include <stdio.h> #include <stdlib.h> #include "Status.h" typedef char TElemType; #include "BiTree.h" void visit(TElemType &e){//元素访问函数 printf("%c", e); } void inputTElem(TElemType &e){ //该函数用于元素输入 scanf("%c", &e); } Status isEmptyElem(TElemType e){ //用于判断e是否为"空树"的特殊值 if(e=='#') return TRUE; else return FALSE; } int main(){//测试主函数 //先创建一棵二叉树并对基本操作进行验证 BiTree T; printf("输入字符序列创建二叉树T:\n"); createBiTree(T); //创建二叉树 printf("二叉树T的先序序列为:"); PreOrderTraverse_N(T, visit); // 非递归先序遍历 printf("\t"); PreOrderTraverse(T, visit); // 递归先序遍历 printf("\n"); printf("二叉树T的中序序列为:"); InOrderTraverse(T, visit); //递归中序遍历 printf("\t"); InOrderTraverse_N(T, visit); //非递归中序遍历 printf("\n"); printf("二叉树T的后序序列为:"); PostOrderTraverse(T, visit); //后序遍历 printf("\n"); int count= countLeaf(T); //求叶子结点数 printf("叶子结点数=%d\n",count); int d=depthBiTree(T); //求深度 printf("深度=%d\n",d); return 0; } //test ABD#G###CE##F##