二叉树遍历(递归版)
来源:互联网 发布:汽车销售网络平台 编辑:程序博客网 时间:2024/06/15 15:52
问题描述:
以一定的方式输入数据(本文是以先序遍历的方式输入),程序根据数据进行解析,创建二叉树,然后对二叉树进行操作,主要操作包括以下几种:
- 求二叉树的高度
- 先序遍历二叉树
- 中序遍历二叉树
- 后序遍历二叉树
- 层序遍历二叉树
先序遍历: 根节点->左子树->右子树
中序遍历: 左子树->根节点->右子树
先序遍历: 左子树->右子树->根节点
层序遍历: 第一层(根节点)->第二层->第三次->….
PS:
1. 大家可以清楚的看到,先序,中序和后序是相对于根节点而言的
2. 非递归版本可以查看我的另外一篇文章:
http://blog.csdn.net/yi_ming_he/article/details/71272568
以下面的例子进行说明:
如图所示,根据上面的遍历顺序,我们可以得到以下遍历结果:
先序遍历: a b d h e c f g
中序遍历: h d b e a f c g
后序遍历: h d e b f g c a
层序遍历: a b c d e f g h
参考代码:
#include <stdio.h>#include <malloc.h>#include <queue>typedef struct BiTNode{ char data; struct BiTNode* lchild; struct BiTNode* rchild;}BiTNode, *Bitree;void CreateBiTree(Bitree& T){ char ch; scanf_s("%c", &ch); //按照先序输入输入二叉树中的节点值,其中#表示空树 if (ch == '#') T = NULL; else { T = (Bitree)malloc(sizeof(BiTNode)); T->data = ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); }}void PreOrderTraverseByRecursion(Bitree T){ if (!T) return; printf("%c ", T->data); PreOrderTraverseByRecursion(T->lchild); PreOrderTraverseByRecursion(T->rchild);}void InOrderTraverseByRecursion(Bitree T){ if (!T) return; InOrderTraverseByRecursion(T->lchild); printf("%c ", T->data); InOrderTraverseByRecursion(T->rchild);}void PostOrderTraverseByRecursion(Bitree T){ if (!T) return; PostOrderTraverseByRecursion(T->lchild); PostOrderTraverseByRecursion(T->rchild); printf("%c ", T->data);}int GetBiTreeHeight(Bitree T){ if (!T) return 0; int nLeftHeight = GetBiTreeHeight(T->lchild); int nRightHeight = GetBiTreeHeight(T->rchild); return (nLeftHeight > nRightHeight ? nLeftHeight : nRightHeight) + 1;}void TraverseTreeByLevel(Bitree T, int nLevel){ if (!T || nLevel < 1) return; if (1 == nLevel) { printf("%c ", T->data); return; } TraverseTreeByLevel(T->lchild, nLevel - 1); TraverseTreeByLevel(T->rchild, nLevel - 1);}void LevelOrderTraverseByRecursion(Bitree T){ int nHeight = GetBiTreeHeight(T); for (int i = 1; i <= nHeight; i++) TraverseTreeByLevel(T, i);}int main(){ Bitree T; CreateBiTree(T); printf("树的高度是: %d\n", GetBiTreeHeight(T)); printf("先序遍历(递归):\n"); PreOrderTraverseByRecursion(T); printf("\n"); printf("中序遍历(递归):\n"); InOrderTraverseByRecursion(T); printf("\n"); printf("后序遍历(递归):\n"); PostOrderTraverseByRecursion(T); printf("\n"); printf("层序遍历(递归):\n"); LevelOrderTraverseByRecursion(T); printf("\n"); return 0;}
运行结果:
3 0
- 二叉树遍历(非递归版)
- 二叉树遍历(递归版)
- 二叉树遍历(非递归版)
- 二叉树遍历(递归)
- 二叉树遍历(递归,非递归)
- 二叉树的遍历(递归遍历)
- 二叉树递归遍历与非递归遍历(终极版)
- 二叉树遍历(递归、非递归、Morris遍历)
- 二叉树遍历(递归、非递归、Morris遍历)
- 二叉树的遍历(递归+非递归+层次遍历)
- 二叉树递归遍历
- 二叉树遍历(递归)
- 二叉树递归遍历
- 递归遍历二叉树
- 递归二叉树遍历
- 二叉树递归遍历
- 递归遍历二叉树
- 二叉树递归遍历
- vivado----fpga硬件调试 (二)----mark_debug
- Hibernate映射集合属性1__Set集合
- Java SE String的equals方法与"=="的区别浅析
- 2、JAVA堆中的对象
- 博客搬家
- 二叉树遍历(递归版)
- 【模拟】洛谷 P1125 笨小猴
- Java设计模式——单例(Singleton)
- Easyui datebox 以月份为单位显示
- java基础学习(12)容器-2
- HTTP协议个人总结
- 用Netcat,SSH构建的IP层加密隧道搭建VPN
- [OpenGL] 随机分形地形生成
- vivado----fpga硬件调试 (三)----mark_debug