第十周 二叉树的遍历递归算法
来源:互联网 发布:php空心菱形 编辑:程序博客网 时间:2024/06/16 16:38
/*
* Copyright (c) 2015, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称: 1.cpp,main.cpp,top.h
* 作者:于东林
* 完成日期:2015年12月30日
* 版本号:codeblocks
*
* 问题描述: <span style="color: rgb(85, 85, 85); font-family: 'microsoft yahei'; font-size: 14px; line-height: 35px;">实现二叉树的先序、中序、后序遍历的递归算法,并对用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”创建的二叉树进行测试</span>.
* 输入描述: 无
* 程序输出: 见运行结果
*/
程序及代码:
#ifndef BTREE_H_INCLUDED#define BTREE_H_INCLUDED#include <stdio.h>#include <malloc.h>#define MaxSize 100typedef char ElemType;typedef struct node{ ElemType data; //数据元素 struct node *lchild; //指向左孩子 struct node *rchild; //指向右孩子} BTNode;void CreateBTNode(BTNode *&b,char *str); //由str串创建二叉链int BTNodeDepth(BTNode *b); //求二叉树b的深度void DispBTNode(BTNode *b); //以括号表示法输出二叉树void DestroyBTNode(BTNode *&b); //销毁二叉树void PreOrder(BTNode *b) ;void InOrder(BTNode *b);void PostOrder(BTNode *b);#endif // BTREE_H_INCLUDED
#include "top.h"void CreateBTNode(BTNode *&b,char *str) //由str串创建二叉链{ BTNode *St[MaxSize],*p=NULL; int top=-1,k,j=0; char ch; b=NULL; //建立的二叉树初始时为空 ch=str[j]; while (ch!='\0') //str未扫描完时循环 { 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==NULL) //p指向二叉树的根节点 b=p; else //已建立二叉树根节点 { switch(k) { case 1: St[top]->lchild=p; break; case 2: St[top]->rchild=p; break; } } } j++; ch=str[j]; }}void DispBTNode(BTNode *b) //以括号表示法输出二叉树{ if (b!=NULL) { printf("%c",b->data); if (b->lchild!=NULL || b->rchild!=NULL) { printf("("); DispBTNode(b->lchild); if (b->rchild!=NULL) printf(","); DispBTNode(b->rchild); printf(")"); } }}void PreOrder(BTNode *b) //先序遍历的递归算法{ if (b!=NULL) { printf("%c ",b->data); //访问根节点 PreOrder(b->lchild); //递归访问左子树 PreOrder(b->rchild); //递归访问右子树 }}void DestroyBTNode(BTNode *&b) //销毁二叉树{ if (b!=NULL) { DestroyBTNode(b->lchild); DestroyBTNode(b->rchild); free(b); }}void InOrder(BTNode *b) //中序遍历的递归算法{ if (b!=NULL) { InOrder(b->lchild); //递归访问左子树 printf("%c ",b->data); //访问根节点 InOrder(b->rchild); //递归访问右子树 }}void PostOrder(BTNode *b) //后序遍历的递归算法{ if (b!=NULL) { PostOrder(b->lchild); //递归访问左子树 PostOrder(b->rchild); //递归访问右子树 printf("%c ",b->data); //访问根节点 }}
#include"top.h"int main(){ BTNode *b; CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"); printf("二叉树b:"); DispBTNode(b); printf("\n"); printf("先序遍历序列:\n"); PreOrder(b); printf("\n"); printf("中序遍历序列:\n"); InOrder(b); printf("\n"); printf("后序遍历序列:\n"); PostOrder(b); printf("\n"); DestroyBTNode(b); return 0;}
运行结果:
知识点总结:
先序遍历:先访问根节点,再先序遍历左子树,最后遍历右子树
中序遍历:先中序遍历左子树,再访问根节点,最后中序遍历右子树
后序遍历:先后序便利左子树,再后序遍历右子树,最后访问根节点
学习心得:
学习知识要一步一步,不要学一点丢一点。
0 0
- 第十周 项目2 二叉树的遍历递归算法
- 第十周项目二~~~二叉树遍历的递归算法
- 第十周--二叉树遍历的递归算法
- 第十周-项目2 - 二叉树遍历的递归算法
- 第十周项目2-二叉树遍历的递归算法
- 第十周-项目2 - 二叉树遍历的递归算法
- 第十周 项目2-二叉树遍历的递归算法
- 第十周 项目二-二叉树遍历的递归算法
- 第十周--项目二--二叉树遍历的递归算法
- 第十周项目2--二叉树遍历的递归算法
- 第十周项目2【二叉树遍历的递归算法】
- 第十周 项目2 二叉树遍历的递归算法
- 第十周项目二 二叉树遍历的递归算法
- 第十周 项目2-二叉树遍历的递归算法
- 第十周项目2-二叉树遍历的递归算法
- 第十周项目2-二叉树遍历的递归算法
- 第十周 项目二 二叉树遍历的递归算法
- 第十周项目2--二叉树遍历的递归算法
- LeetCode 088 Merge Sorted Array
- 软件测试过程文档结构
- ExpandableListView的使用
- UISwitch详解
- 【LCA】CodeForce #326 Div.2 E:Duff in the Army
- 第十周 二叉树的遍历递归算法
- Android自定义控件入门实践之雷达扫描控件
- 软件复杂度评价
- opengl简单视频教程
- 2015三十本好书推荐及理由
- Android Studio教程从入门到精通
- Swift-解析JSON数据(天气)
- DateUtils
- 上机实验——Linux中Vi的基本用法