首页 > 其他分享 >二叉树 (王道数据结构 C语言版)

二叉树 (王道数据结构 C语言版)

时间:2024-11-08 14:00:17浏览次数:6  
标签:return lc int C语言 二叉树 rc 数据结构 data rear

2004.11.04

  • 计算一颗给定二叉树的所有双分支节点个数
  • 编写把一个树的所有左右子树进行交换的函数
  • 求先序遍历中第k个结点的值 (1 <= k <= 二叉树中的结点个数)
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;

typedef struct Bitnode{
	int data;
	struct Bitnode *lc,*rc;
}Bitnode,*Bitree;
//-------------------------------------------------------------------------

//王道数据结构  P158  T07  
//计算一颗给定二叉树的所有双分支节点个数

int getnum(Bitree T)
{
	if(T==NULL) return 0; //若b为空则贡献0
	else if(T->lc && T->rc) return getnum(T->lc)+getnum(T->rc)+1;//有左右节点,贡献给上一层+1
	else return getnum(T->rc)+getnum(T->lc);  //只有一个节点则归到上一层 数量不变
}

//----------------------------------------------------------------------------------

//王道数据结构 P158 T07
//编写把一个树的所有左右子树进行交换的函数

void swaptree(Bitree T)
{
	if(T==NULL) return;
	else if(T->lc && T->rc) {
		swaptree(T->lc); //递归进左子树
		swaptree(T->rc);//递归进右子树
		swap(T->lc,T->rc);
	}
}
//-------------------------------------------------------------------------

//王道数据结构 P158 T09
//求先序遍历中第k个结点的值 (1 <= k <= 二叉树中的结点个数)

//---------------------版本1(自写版)------------------
int  idx=1;
void getknode (Bitree T,int k)
{
	if(T==NULL ) return ;
	if(idx==k) {
		cout<<T->data;
		return ;
	}
	idx++;
	
	getknode(T->lc,k);
	getknode(T->rc,k);
	
}
//---------------------王道答案版--------------------
int i=1;
ElemType  prenode(Bitree T,int k)
{
	if(T==NULL) return '#' ; //空结点 返回特殊字符
	if(i==k) return T->data;
	i++;
	
	char ch=prenode(T->lc,int k);//进左子树查找
	if(ch!='#') return ch; //如果空结点返回的元素值没有意义 
	
	char ch=prenode(T->rc,int k);
	if(ch!='#') return ch;
	
}

2024.11.08

  • 二叉树以二叉链表存储 求非空二叉树的宽度
#include<bits/stdc++.h>

#define endl '\n'
using namespace std;
#define Maxsize 150
typedef struct Bitnode {
	int data;
	struct Bitnode *lc,*rc;
} Bitnode,*Bitree;

//王道数据结构   P159  T13

//-----------二叉树以二叉链表存储 求非空二叉树的宽度------------

typedef struct {
	int front, rear;
	int level[Maxsize];//存层次的序号
	Bitree data[Maxsize];//存元素
} Queue;

int getwidth(Bitree T, Queue Q) {
	Bitree p;//工作指针
	int k;//用来更新层次下标
	Q.front = Q.rear = -1;

	Q.rear++;//元素入队
	Q.data[Q.rear] = T; //根节点入队
	Q.level[Q.rear] = 1;

	while (Q.front < Q.rear) {
		//取出队头
		Q.front++;
		p = Q.data[Q.front];
		k = Q.level[Q.front];

		if (p->lc) { //左孩子入队
			Q.rear++;
			Q.data[Q.rear] = p->lc;
			Q.level[Q.rear] = k + 1; //更改对应的层次
		}//注意 不可以写成else if

		if (p->rc) { //右孩子入队
			Q.rear++;
			Q.data[Q.rear] = p->rc;
			Q.level[Q.rear] = k + 1;;
		}
	}

	int Max=0;//统计最大宽度
	int i=0;//移动指针
	int tmp=0;//统计对应层次序号的数量
	k=1;
	
	//遍历统计最大值
	while(i<=Q.rear)
	{
		tmp=0;
		while(i<=Q.rear && Q.level[i]==k)
		{
			tmp++;
			i++;
		}
		k=Q.level[i];
		if(tmp>Max) Max=tmp;
	}
	return Max;
	
}
//--------------------------------------------------------------

  • 将给定的表达式树 转换为等价的中缀表达式并输出

叶子结点肯定是操作数,非叶子结点就是运算符

#include<bits/stdc++.h>

#define endl '\n'
using namespace std;

//王道数据结构 P159 T18 
//将给定的表达式树 转换为等价的中缀表达式并输出


//注意表达式树的叶子结点 肯定是操作数
//根节点和叶子结点不加括号, 其余记得添加括号
typedef struct node{
	char data[10];
	struct  node *left ,*right;
}BTree;



void getin(BTree *T,int dep)
{
	if(T==NULL) return ;
	else if(!T->left && !T->right) //叶子结点 输出操作数
	{
		cout<<T->data;
	}else {
		if(dep>1)	cout<<"(";//若有子表达式 则加一层括号
		getin(T->left,dep+1);
		cout<<T->data; //输出操作符
		getin(T->right,dep+1);
		if(dep>1) cout<<")";//若有子表达式加一层括号
	}
}

void BtreeToe(BTree *T)
{
	getin(T,1);//从根节点进入
}


signed main() {

}

标签:return,lc,int,C语言,二叉树,rc,数据结构,data,rear
From: https://www.cnblogs.com/swjswjswj/p/18526128

相关文章

  • 用C语言实现汉诺塔问题(第四天:函数递归)【每天进步一点点-小白学习笔记】
    0 前言        最近比较忙,到现在才有时间更新博客,这两天刚好学到了函数递归,这是个很有趣的知识,为什么说有趣呢?因为递归这个东西吧,很多人都对它又爱又恨。爱在递归不仅可以轻松简化代码,增加可读性,还能将一些很难解决的算法问题轻松解决,但它又大大加大了程序复杂度,既......
  • 2个月搞定计算机二级C语言——真题(10)解析qg
    合集-3个月搞定计算机二级C语言(6)1.2个月搞定计算机二级C语言——真题(5)解析10-292.2个月搞定计算机二级C语言——真题(6)解析10-303.2个月搞定计算机二级C语言——真题(7)解析11-034.2个月搞定计算机二级C语言——真题(8)解析11-035.2个月搞定计算机二级C语言——真题(9)解析11-06:Flow......
  • c语言入门学习这一篇就够了-知识点总结(三万字二级必看)
    C语言   C语言是中高级语言的代表之一,它是所有现代编程语言的基石,包括C++、Java、C#、Python、JavaScript、Swift等。C语言是学习其他编程语言的基础,因为它提供了对系统底层的精确控制,这使得它在开发操作系统、驱动程序、嵌入式系统、高性能计算等领域中有着不可替代的......
  • 数据结构 --树
    定义树是n(n>=0)个结点的有限集。n=0时,称为空树。在任意一棵树非空树中应满足:(1)有且仅有一个特定的称为根(root)的结点(2)当时,其余结点可分为个互不相交的有限集,其中每一个集合本身又是一颗树,并且称为根的子树。基本概念结点的度:一个结点拥有的子树的数目叶子结点:度为0......
  • (C语言)内存函数
    目录1)memcpy 1)memcpy的模拟实现2)memmove2)memmove的模拟实现3)memset4)memcmp1)memcpymemcpy是内存拷贝函数,其不同于strncpy在于其能拷贝任意数组;形式:void*memcpy(void*destinatoin,char*source,size_t num);destination是目标空间地址,source是源空间地址;num是拷贝......
  • 二叉树的递归遍历和迭代遍历
    递归每次写递归,都按照这三要素来写,可以保证大家写出正确的递归算法!确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。确定终止条件:写完了递归算法,运行的时......
  • 重温c语言之,7天开整,就是随便的写写,第八天
    一:函数1、递归题目:求n的阶乘(不考虑溢出)上代码1#include<stdio.h>2intfactorial(intn){3if(n>1){4returnn*(factorial(n-1));5}6else7{8return1;9}10}11#include<stdio.h>12in......
  • 数据结构学习笔记---线性表:顺序表(插入)
    顺序表的基本操作——插入首先,静态分配一个顺序表#include<stdio.h>#include<stdlib.h>#defineMaxSize5//定义队列的最大长度typedefstruct{ intdata[MaxSize]; intlength;}SqList;然后实现插入方法,for循环我们提前插入了四个元素,顺序排放原理是以i为......
  • C语言入门第二天常量
    一:常量1:整形常量a:八进制开头是0开头例如06434b:十六进制开头是0x开头例如0xd1cc:代码展示其中%d表示十进制,%o表示八进制,%x表示十六进制。2:浮点类型a:浮点常量又被称为实数,一般含有小数部分。b:float类型小数点的精度为6位c:想printf输出为浮点类型用%f;d:代码展示......
  • 2个月搞定计算机二级C语言——真题(10)解析
    1.前言本篇我们讲解2个月搞定计算机二级C语言——真题102.程序填空题2.1题目要求2.2提供的代码#include<stdio.h>#pragmawarning(disable:4996)doublefun(doublex[],intn){ inti,k=0; doubleavg=0.0,sum=0.0; for(i=0;i<n;i++) avg......