数据结构---C语言版 树 图解版&&力扣144/94/102

树的声明:

cpp 复制代码
#include<stdio.h>
#include<stdlib.h> 
using namespace std;

typedef char BiElemType;
typedef struct BiTNode{
	BiElemType data;
	struct BiTNode* lchild;
	struct BiTNode* rchild;
}BiTNode,*BiTree; 

//树中任何一个节点都是一个结构体,它的空间我们是通过malloc申请出来的。
//tag 辅助队列使用
typedef struct tag{
	BiTree p;
	struct tag* pnext;
}tag_t,*ptag_t; 

二叉树的层次建立

画图理解:

cpp 复制代码
//层次建树 
int main(){
	BiTree  pnew;//存放树的新结点 
	char c;
	BiTree tree=NULL;//建立一棵树,让其为空 
	ptag_t phead=NULL,ptail=NULL,listpnew=NULL,pcur=NULL;
	//phead,ptail是辅助队列的头,尾指针,listpnew指向存放新的队列节点,pcur指向当前元素的双亲节点;
	while(scanf("%c",&c)){
		if(c=="\n") break;
		
		//calloc(n,m);n 申请空间个数,m申请一个空间的大小;总大小为n*m;
		//跟malloc相比,他可以直接将元素赋值为空 
		pnew=(BiTNode*)calloc(1,sizeof(BiTNode));//申请一个新的树节点 ,并保证左右孩子均为空 
		pnew->data=c;
		
		listpnew=(tag_t*)calloc(1,sizeof(tag_t));//申请一个新的辅助队列节点
		listpnew->p=pnew;//新的辅助队列节点 对应的树元素是 pnew 
		
		if(!tree){//树为空,即 pnew为根节点 
			tree= pnew;//令pnew为根节点 
			phead=listpnew;ptail=listpnew;//队列头尾都指向此时这个节点的队列节点 
			pcur=listpnew;
			continue;
		}
		else {//树不为空, 此队列节点依然需要入队 
			ptail->pnext=listpnew;
			ptail=listpnew; 
			//如果放在左孩子位置,只需要入树即可 
			if(!pcur->p->lchild)
				pcur->p->lchild= pnew;
			//如果放在右孩子位置,需要入树且(放入后此节点的两个孩子就全了)双亲节点需要更换为下一个 
			else if(!pcur->p->rchild){
				pcur->p->lchild= pnew;
				pcur=pcur->pnext;
			}
		}
	}
	return 0;
}

二叉树的前中后序遍历--递归

前序遍历:根左右,中序遍历:左根右 后序遍历:左右根(所谓前中后是根的相对位置,这个也是功能函数所在的位置)

cpp 复制代码
//功能
void visit(BiTree p){
	printf("%c",p->data);
}
//前序 
void Preorder(BiTree p){
	if(p){
		visit(p);
		Preorder(p->lchild);
		Preorder(p->rchild);	
	}
}
//中序 
void INorder(BiTree p){
	if(p){
		INorder(p->lchild);
		visit(p);
		INorder(p->rchild);	
	}
}
//后序 
void Postorder(BiTree p){
	if(p){
		Postorder(p->lchild);
		Postorder(p->rchild);
		visit(p);	
	}
}

层次遍历---需要借助队列

层次遍历:一层一层的往下走。又称广度优先遍历

cpp 复制代码
//层次遍历 
void Leverorder(BiTree T){
	LinkQueue Q;
	InitQueue(Q);
    EnQueue(Q,T);
	BiTree p;
	while(!IsEmpty(Q)){
		DeQueue(Q,p);//删除存放到p中
		putchar(p->data);
		if(p->lchild)
			EnQueue(Q,p);
		if(p->rchild)
			EnQueue(Q,p);
	}
}

练习题

144. 二叉树的前序遍历

94. 二叉树的中序遍历

102. 二叉树的层序遍历

另外推荐一篇题解:BFS 的使用场景总结:层序遍历、最短路径问题:

本篇over

相关推荐
浅川.257 小时前
STL专项:stack 栈
数据结构·stl·stack
自然常数e9 小时前
字符函数和字符串函数
c语言·算法·visual studio
youngee119 小时前
hot100-56最小栈
数据结构
山上三树9 小时前
main()函数带参数的用法
linux·c语言
lengjingzju9 小时前
一网打尽Linux IPC(一):进程间通信完全指南——总体介绍
linux·服务器·c语言
不忘不弃10 小时前
从字符串中提取数字
数据结构·算法
点云SLAM10 小时前
C++ 引用折叠(Reference Collapsing)和示例讲解说明
数据结构·c++·标准算法·完美转发·代码性能优化·c++ 引用折叠·typedef / using
hqyjzsb11 小时前
从爱好到专业:AI初学者如何跨越CAIE认证的理想与现实鸿沟
大数据·c语言·人工智能·信息可视化·职场和发展·excel·业界资讯
历程里程碑12 小时前
滑动窗口解法:无重复字符最长子串
数据结构·c++·算法·leetcode·职场和发展·eclipse·哈希算法
Felven12 小时前
C. Maximum Median
c语言·开发语言·算法