二叉树的建立和三种遍历的递归方式
来源:互联网 发布:公司网络配置方案 编辑:程序博客网 时间:2024/06/15 07:14
二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^{i-1}个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二叉树T,如果其终端结点数为n_0,度为2的结点数为n_2,则n_0=n_2+1。
一棵深度为k,且有2^k-1个节点称之为满二叉树;深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为完全二叉树。
二叉树的建立过程是二叉链表的方式,即当前结点不光存储当前结点的数据,还存储左右孩子的指针
这里多加了一个level用来判断结点在第几层
二叉树中的中序和后序遍历都是因为结点的建立问题,不能用于建立一个二叉树
include<stdlib.h>include<stdio.h>typedef char ElemType;//二叉链表的构建形式typedef struct binaryTree{ ElemType data; struct binaryTree *lchild,*rchild;}binaryTree,*BiTree;
//访问一个结点并打印void visited(char c,int level){ printf("%c在第%d层 \n",c, level);}
//使用前序的方式建立一个二叉树void PreorderCreateBinaryTree(BiTree *T){ char c; scanf("%c",&c); if( '#' == c) { *T = NULL; } else{ *T = (BiTree)malloc(sizeof(binaryTree)); (*T)->data = c; PreorderCreateBinaryTree(&(*T)->lchild); PreorderCreateBinaryTree(&(*T)->rchild); }}
//前序遍历二叉树void PreorderTraversal(BiTree T,int level){ if( T ) { visited(T->data,level); PreorderTraversal(T->lchild,level + 1); PreorderTraversal(T->rchild, level + 1); }}
//中序遍历二叉树void OrderTraversal(BiTree T ,int level){ if( T ) { PreorderTraversal(T->lchild,level + 1); visited(T->data,level); PreorderTraversal(T->rchild,level + 1); }}
//后序遍历二叉树void PosteriorTraversal(BiTree T,int level){ if( T ) { PosteriorTraversal(T->lchild,level + 1); PosteriorTraversal(T->rchild,level + 1); visited(T->data,level); }}
//层序的方式实现二叉树的遍历--------------------------------------------//利用递归的方法,按层进行打印,我们把根节点当做第0层,之后层次依次增加,如果我们想打印第二层怎么办呢,利用递归的代码如下:int sequence_traversal_level(BiTree T, int level) { if (!T || level < 0) //当树的结点不存在,并且或者根节点不存在(深度小于0)的时候,结束 return 0; if (0 == level) { //当level为0的时候,说明这一层遍历完成,需要换行 printf("%c ",T->data); return 1; } return sequence_traversal_level(T->lchild, level - 1) + sequence_traversal_level(T->rchild, level - 1);//左右孩子的返回值加一次为0,才能确定没有下一层,否则就需要遍历下一层;}//如果我们成功的打印了给定的层次,那么就返回非0的正值,如果失败返回0。//有了这个思路,我们就可以应用一个循环,来打印这颗树的所有层的节点,但是有个问题就是我们不知道这棵二叉树的深度,//怎么来控制循环使其结束呢,仔细看一下sequence_traversal_level,如果指定的Tree是空的,那么就直接返回0,//当返回0的时候,我们就结束循环,说明没有节点可以打印了。void sequence_traversal(BiTree T) { int i = 0; for (i = 0; ; i++) { if (!sequence_traversal_level(T, i)) //当链表中的第i层不存在的时候退出,或者树为空的时候 遍历完成,退出循环 { break; } else{ //否则就是该层次打印完成,换行 printf("\n"); } } printf("\n");}
int main(){ BiTree T; int level = 1; printf("建立二叉树并访问节点"); printf("请输入结点数据,建立树:\n"); PreorderCreateBinaryTree(&T); PosteriorTraversal(T , level); return 0;}
阅读全文
1 0
- 二叉树的建立和三种遍历的递归方式
- 二叉树的三种遍历方式(递归、非递归和Morris遍历)
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 二叉树的递归建立和遍历
- 二叉树的三种遍历方式(递归和非递归的实现方法)
- 二叉树的三种遍历方式的递归实现和非递归实现
- 二叉树的递归和非递归方式的三种遍历
- 二叉树的三种遍历方式的循环和递归的实现方式
- 二叉树的三种遍历方式(递归和非递归)
- 二叉树的三种遍历方式(递归 和 非递归)
- C++实现二叉树的建立和三种递归遍历
- 二叉树的建立以及三种遍历方式
- 二叉树的三种遍历方式:递归、栈、循环
- (C++)二叉树的建立与递归方式遍历
- c++ 二叉树 的递归建立和递归遍历
- 二叉树的建立和遍历(递归、非递归)
- 二叉树的三种遍历方式的递归实现和迭代实现
- 二叉树的建立、三种(递归、非递归)遍历方法
- C3P0连接池的配置与使用
- 单例的三种模式
- netty入门
- Android_网络框架--Volley
- HDU1032
- 二叉树的建立和三种遍历的递归方式
- java单例设计模式
- 磁盘分区,格式化,挂载
- VPS安装和访问CentOS 7远程桌面
- 遗忘现在的路上,我们走向成长
- 寒蝉在柳--解
- 练习 3-1 在上面有关折半查找的例子中,while循环语句内共执行了两次测试,其实只要一次就足够(代价是将更多的测试在循环外执行)。重写该函数,使得在循环内部只执行一次测试。
- vue项目优化之按需加载组件-使用webpack require.ensure
- android响应式沉浸栏适配