二叉树(二)——遍历、深度统计、叶子结点统计、结点统计

1.二叉树的相关算法的实现(链表)。

#include <stdio.h>
#include <malloc.h>

#define NULL	0

typedef struct tree
{
	int data;
	struct tree *left, *right;
}ElemBT;

void create_btree(ElemBT *root, int list[], int n) /*n表示list数组中元素的个数*/
{
	int i;
	ElemBT *current, *parent, *p;

	for(i = 1; i < n; i++)
	{
		p = (ElemBT *)malloc(sizeof(ElemBT));
		p->left = p->right = NULL;
		p->data = list[i];
		current = root;
		while(current != NULL)
		{
			parent = current;
			if(current->data > p->data)
				current = current->left;
			else
				current = current->right;
		}
		if(parent->data > p->data)
			parent->left = p;
		else
			parent->right = p;
	}
}

void pre_order(ElemBT *root) /*前序遍历*/
{
	if(root) /*root != NULL*/
	{
		printf("%4d", root->data); /*根结点打印*/
		pre_order(root->left); /*左子树遍历*/
		pre_order(root->right); /*右子树遍历*/
	}
	else
	{
		return;
	}
}

void in_order(ElemBT *root) /*中序遍历*/
{
	if(root) /*root != NULL*/
	{
		in_order(root->left); /*左子树遍历*/
		printf("%4d", root->data); /*根结点打印*/
		in_order(root->right); /*右子树遍历*/
	}
	else
	{
		return;
	}
}

void post_order(ElemBT *root) /*后序遍历*/
{
	if(root) /*root != NULL*/
	{
		post_order(root->left); /*左子树遍历*/
		post_order(root->right); /*右子树遍历*/
		printf("%4d", root->data); /*根结点打印*/
	}
	else
	{
		return;
	}
}

int node_count(ElemBT *root) /*二叉树结点个数统计*/
{
	int cnt = 0;

	if(root)
	{
		cnt += node_count(root->left);
		cnt += node_count(root->right);
		cnt ++; /*根节点*/
	}

	return cnt;
}

/*
int node_count(ElemBT *root) //结点个数统计
{
	if(root == NULL)
		return 0;
	else
		return (node_count(root->right)+node_count(root->left)+1);
}
*/

int btree_depth(ElemBT *root) /*二叉树的深度*/
{
	int d1 = 0, d2 = 0;

	if(root == NULL)
		return 0;
	else
	{
		d1 = btree_depth(root->left);
		d2 = btree_depth(root->right);
		return (d1>d2 ? d1+1 : d2+1);
	}
}

int leaf_count(ElemBT *root) /*统计叶子结点个数*/
{
	if(!root)
		return 0;

	if(!root->left && !root->right)
		return 1;
	else
		return (leaf_count(root->left)+leaf_count(root->right));
}

int main()
{
	int list[7] = {30, 18, 16, 25, 34, 7, 31};
	ElemBT *root;

	root = (ElemBT *)malloc(sizeof(ElemBT));
	root->data = list[0];
	root->left = root->right = NULL;
	create_btree(root, list, 7);

	printf("pre_order:\n");
	pre_order(root);
	printf("\n");

	printf("in_order:\n");
	in_order(root);
	printf("\n");

	printf("post_order:\n");
	post_order(root);
	printf("\n");

	printf("Node number is: %d\n", node_count(root));
	printf("Btree depth is: %d\n", btree_depth(root));
	printf("Leaf node number is: %d\n", leaf_count(root));
	return 0;
}

程序运行截图:

2.结论

(1)通过一棵二叉树的前序、中序、后序中任意两个的访问顺序可以唯一的确定一棵二叉树。

假设有二叉树的中序和后序访问顺序分别为:

中序:c, b, d, e, a, g, i, h, j, f

后序:c, e, d, b, i, j, h, g, f, a

分析:由后序遍历最末一个是a可以知道a为该树的根,再结合中序可知道c, b, d, e为其左子树,g, i, h, j, f为其右子树。又结合后序访问可以知道b, f分别为为a的左子女和右子女,再结合中序遍历可以知道b的左子女个数为1,右子女个数为2,f的左子女个数为4,右子女个数为0。依次类推可以得到如下的二叉树:

a

/          \

b                  f

/     \           /

c          d       g

\        \

e          h

/   \

i       j

二叉树(二)——遍历、深度统计、叶子结点统计、结点统计

时间: 2024-07-28 17:52:35

二叉树(二)——遍历、深度统计、叶子结点统计、结点统计的相关文章

先序遍历创建二叉树,对二叉树统计叶子节点个数和统计深度(创建二叉树时#代表空树,序列不能有误)

#include "stdio.h" #include "string.h" #include "malloc.h" #define NULL 0 #define MAXSIZE 30 typedef struct BiTNode      //定义二叉树数据结构 { char data; struct BiTNode *lchild,*rchild; } BiTNode; void preCreate(BiTNode *& T)   /

二叉树的模板 先序建立 二叉树的遍历 深度

关于二叉树,基本操作都是在递归的基础上完成的,二叉树的层次遍历是队列实现.具体解释看代码 #include<iostream> #include<stack> #include<queue> #include<stdio.h> #include<stdlib.h> using namespace std; //二叉树结点 typedef struct BiTNode { //数据 char data; //左右孩子指针 struct BiTNod

二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现

一.基本概念 每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒. 性质: 1.非空二叉树的第n层上至多有2^(n-1)个元素. 2.深度为h的二叉树至多有2^h-1个结点. 满二叉树:所有终端都在同一层次,且非终端结点的度数为2. 在满二叉树中若其深度为h,则其所包含的结点数必为2^h-1. 完全二叉树:除了最大的层次即成为一颗满二叉树且层次最大那层所有的结点均向左靠齐,即集中在左面的位置上,不能有空位置. 对于完全二叉树,设一个结点为i则其父节点为i/2,2i为左子节点,2i+1为右子节

Java实现二叉树地遍历、求深度和叶子结点的个数

一.分析 二叉树是n个结点所构成的集合,它或为空树,或为非空树.对于非空树,它有且仅有一个根结点,且除根结点以外的其余结点分为两个互不相交的子集,分别称为左子树和右子树,它们本身又都是二叉树. 显而易见,二叉树具有递归的性质,因此表示二叉树的结点至少要包含3个域:数据域.左指针.右指针.在Java中,我们可以将二叉树的结点视为一个类,其中含有左子树地址.右子树地址和数据三个属性,每个结点即使类的实例化对象.因为二叉树的递归性质,所以我们可以通过递归来实现二叉树地求深度.求叶子结点的个数.先序.中

二叉树的遍历,深度求解以及竖向打印详析

二叉树是每个节点最多有两个子树的有序树.二叉树常被用于实现二叉查找树和二叉堆.值得注意的是,二叉树不是树的特殊情形.在图论中,二叉树是一个连通的无环图,并且每一个顶点的度不大于2.有根二叉树还要满足根结点的度不大于2.有了根结点后,每个顶点定义了唯一的根结点,和最多2个子结点.然而,没有足够的信息来区分左结点和右结点.二叉树详细请看本文:二叉树 所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问.访问结点所做的操作依赖于具体的应用问 题. 遍历是二叉树上

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int

SDUT 3341 数据结构实验之二叉树二:遍历二叉树

数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点).请建立二叉树并按中序和后序的方式遍历该二叉树. Input 连续输入多组数据,每组数据输入一个长度小于50个字符的字符串. Output 每组输入数据对应输出2行:第1行输出中序遍历序列:第2行输出后序遍历序列

SDUT-3441_数据结构实验之二叉树二:遍历二叉树

数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点).请建立二叉树并按中序和后序的方式遍历该二叉树. Input 连续输入多组数据,每组数据输入一个长度小于50个字符的字符串. Output 每组输入数据对应输出2行: 第1行输出中序遍历序列: 第2行输出后序遍历序列. Sample Inp

新版的复制统计工具介绍,微信加粉推广辅助工具,增强了复制统计功能以外,新增了二维码轮播,电话拨打统计

今年已经发展到了3.x版本,新版的比老版本新增了很多功能,除了之前已有的微信号在线管理,和复制统计,以及网页状态监控等功能以外.新增了扫码统计,二维码轮播,微信号自动上下控制,手动控制,拨打电话统计,点击复制,打开微信等,还有更强大的拦截功能.到现在为止,我们应该是最完善的微信加粉推广辅助工具了. 并且我们一直提供免费版,相对于付费版功能并无过多缩减,只是限制了能统计的落地页的数量,因为统计流量巨大,如果免费开放更多会统计的数量会占用更多的服务器资源造成服务器压力过大,从而服务器成本也会直线上升

javascript实现数据结构: 树和二叉树,二叉树的遍历和基本操作

树型结构是一类非常重要的非线性结构.直观地,树型结构是以分支关系定义的层次结构. 树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结构:在数据库系统中,可用树来组织信息:在分析算法的行为时,可用树来描述其执行过程等等. 下面讲解的内容完整代码在这:https://github.com/LukeLin/data-structure-with-js/blob/master/Binary%20tree/BinaryTree.js 首先看看树的一些概念: 1.树(Tree)是n