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

树和二叉树

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

树和二叉树

顺序存储链式存储
数组下标能反映二叉树中结点之间的逻辑关系比较适用于完全二叉树、满二叉树每个结点有两个指针域,n个结点有2n个指针域,n+1个空链域(可用于构造线索二叉树)

链式存储构建一个二叉树
(1)声明一个指向根节点的指针root,刚开始指向NULL

(2)插入根节点

(3)插入新节点(作为根节点的左孩子)

代码:

#include
using namespace std;

//存储结构 
struct ElemType {
	int value;
};

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

int main() {
	//(1)声明一个指向根节点的指针root,刚开始指向NULL
	BiTree root = NULL;

	//(2)插入根节点
	root = (BiTree)malloc(sizeof(BiTNode));
	root->data = {1};
	root->lchild = NULL;
	root->rchild = NULL;

	//(3)插入新节点(作为根节点的左孩子) 
    BiTNode * p = (BiTNode *)malloc(sizeof(BiTNode));
	p->data = {2};
	p->lchild = NULL;
	p->rchild = NULL;
	root->lchild = p; 
	
	printf("%d %d n",root->data,root->lchild->data);   //输出根节点的data 和 根节点的左孩子的地data


	return 0;
}

二叉树的遍历
(1)先序遍历、中序遍历、后序遍历

//先序遍历
void PreOrder(BiTree T) {
	if(T!=NULL) {
		visit(T);
		PreOrder(T->lchild);
		PreOrder(T->rchild);
	}

}

//中序遍历
void InOrder(BiTree T) {
	if(T!=NULL) {
		PreOrder(T->lchild);
		visit(T);
		PreOrder(T->rchild);
	}
}

//后序遍历
void PostOrder(BiTree T) {
	if(T!=NULL) {
		PreOrder(T->lchild);
		PreOrder(T->rchild);
		visit(T);
	}
}

(2)层次遍历

  1. 先构建一个辅助队列
  2. 根结点入队
  3. 若队列非空,则队头结点出队,访问该结点,并将其左、右孩子插入队尾(如果有的话)
  4. 重复第三步,直至队列为空
void LevelOrder(BiTree T){
	LinkQueue Q;
	InitQueue(Q);
	BiTree p;
	EnQueue(Q,T);		//根结点入队
	while(!IsEmpty(Q)){	//队列不为空循环 
		DeQueue(Q,p);	//根结点出队 
		visit(p);		//访问队头结点 
		if(p->lchild!=NULL)
			EnQueue(Q,p->lchild);	//左孩子入队(指针)
		if(p->rchild!=NULL)
			EnQueue(Q,p->rchild);	//右孩子入队(指针)
	} 
	
} 

求树的高度(后序遍历算法)

int treeDepth(BiTree T) {
	if(T==NULL) {
		return 0;
	} else {
		int l = treeDepth(T->lchild);
		int r = treeDepth(T->rchild);
		return l>r?l+1:r+1;
	}
}

来自王道

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

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

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