栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言树总结

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言树总结

#include 
#include 
 typedef struct BitNode {
	int data;//数据域
	struct BitNode* lchild;//左孩子指针
	struct BitNode* rchild;//右孩子指针
	//struct BitNode* parent;//三叉链表
}BitNode,*BiTree;//二叉树二叉链表链式存储
 
 
 int visit(BiTree A) {
	 return A->data;
 }
 void PreOrder(BiTree T) {
	 if (T!= NULL) {
		 visit(T);
		 PreOrder(T->lchild);
		 PreOrder(T->rchild);
	 }
 }//先序遍历根左右
 void InOrder(BiTree T) {
	 if (T != NULL) {
		 InOrder(T->lchild);
		 visit(T);
		 InOrder(T->rchild);
	 }
 }//中序遍历左根右
 void PostOrder(BiTree T) {
	 if (T != NULL) {
		 PostOrder(T->lchild);
		 PostOrder(T->rchild);
		 visit(T);
	 }
 }//后序遍历左右根
 //时间复杂度O(n)
 void LevelOrder(BiTree T) {
	 //InitQueue(Q);初始化辅助队列
	 BiTree p;//队头元素
	// InQueue(Q, T);根节点入队
	
 }//层次遍历
 
 typedef struct ThreadNode {
	 int data;//数据域
	 struct ThreadNode* lchild, * rchild;//左右孩子指针
	 struct ThreadNode* ltag, * rtag;//左右线索标志ltag为0 lchild指左孩子为1指前驱
 }ThreadNode,*ThreadTree;//线索二叉树
 void InThread(ThreadTree p, ThreadTree pre) {//pre为P的前驱pre为刚访问过的结点p为正在访问的结点
	 if (p != NULL) {
		 InThread(p->lchild, pre);
		 //visit(p);
		 if (p->lchild == NULL) {
			 p->lchild = pre;
			 p->ltag = 1;
		 }
		 if (pre != NULL && pre->rchild == NULL) {
			 pre->rchild = p;
			 pre->rtag = 1;
		 }
		 pre = p;
		 InThread(p->rchild, pre);
	 }
 }//中序遍历的二叉树线索化
 void CreatInThread(ThreadTree T) {
	 ThreadTree pre = NULL;
	 if (T != NULL) {
		 InThread(T, pre);
		 pre->lchild = NULL;
		 pre->ltag = 1;
	 }
 }//建立中序线索二叉树
 ThreadNode* Firstnode(ThreadNode* p){
	 while (p->ltag == 0)
		 p = p->lchild;
	 return p;
 }//找以p为根结点的树的中序序列中第一个结点
 ThreadNode* Nextnode(ThreadNode* p) {
	 if (p->ltag == 1) {
		 return p->lchild;
	 }
	 else {
		 return Firstnode(p->lchild);
	 }
 }//求p在中序序列中的后继
 void Inorder(ThreadNode* T) {
	 for (ThreadNode* p = Firstnode(T); p != NULL; p = Nextnode(p)) {
		 visit(p);
	 }
 }//中序遍历
#define Max_Tree_Size 100
 typedef struct PTNode {
	 int data;//数据域
	 int parent;//双亲位置域
 }PTNode;
 typedef struct PTree {
	 PTNode nodes[Max_Tree_Size];
	 int node;//结点数
 }PTree;//树的双亲表示法根结点位置为0 parent置-1
 typedef struct CBNode {
	 int data;//数据域
	 struct CBNodde* firstchild, * rightbrother;//结点第一个孩子指针,右兄弟指针
 }CBNode,*CBTree;//孩子兄弟表示法用于树森林转化为二叉树
 
 typedef struct BSTNode {
	 int key;//数据域
	 struct BSTNode* lchild, * rchild;//左孩子指针,右孩子指针
 }BSTNode,*BSTree;//排序二叉树
 BSTNode* BST_Search(BSTree T, int key) {
	 while (T != NULL && T->key != key) {
		 if (T->key > key) {
			 T = T->lchild;
		 }
		 else {
			 T = T->rchild;
		 }
	 }
	 return T;
 }//非递归查找操作空间复杂度O(1)
 BSTNode* BST_Search(BSTree T, int key) {
	 if (T == NULL) {
		 return NULL;
	 }
	 else if (T->key == key)
		 return T;
	 else if (T->key > key)
		 return BST_Search(T->lchild, key);
	 else
		 return BST_Search(T->rchild, key);
 }//递归查找操作空间复杂度O(h)
 bool BST_Insert(BSTree T, int k) {
	 if (T->key == k)
		 return false;
	 else if (T->key > k) {
		 return BST_Insert(T->lchild, k);
	 }
	 else if (T->key < k) {
		 return BST_Insert(T->rchild, k);
	 }
	 else {
		 T = (BSTNode*)malloc(sizeof(BSTNode));
		 T->key = k;
		 T->lchild = T->rchild = NULL;
		 return true;
	 }
 }//二叉排序树插入操作
 void Creat_BST(BSTree T, int str[], int n) {//T为根结点 str为要插入二叉树中的数值数组 n为数据个数
	 T = NULL;
	 int i = 0;
	 while (i < n) {
		 BST_Insert(T, str[i]);
		 i++;
	 }
 }//二叉排序树的构造将二叉排序树中序遍历可得到递增序列
 
 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/874954.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号