按照数组顺序插入到二叉树中

按照数组顺序插入到二叉树中

参考文章

数组与二叉树的对应关系:一个结点在数组中的序号为 i,则其左孩子结点序号为 2 * i,右孩子结点序号为 2 * i + 1;

根据这条关系,我们可以建立个按照数组顺序的二叉树;

代码说明: 按数组 arr 顺序建立二叉树,i 为当前插入元素在数组中的位置,n 为数组元素个数,root 为本次插入的结点地址;这个函数的作用是将数组中 arr[i] 元素插入到地址为 root 的位置上,那么结点 root 的左孩子结点插入元素为 arr[2 * i],右孩子结点插入元素为 arr[2 * i + 1];每次创建一个结点,创建的结点就是上一个结点对应的左右结点;


node* insertLeverOrder(Type arr[], node* &root, int i, int n) {	 
	 if(i < n) {
	 	node* temp = create(arr[i]);	//创建一个新的结点
	 	root = temp;
	 	root->lchild = insertLeverOrder(arr, root->lchild, 2 * i, n);
	 	root->rchild = insertLeverOrder(arr, root->rchild, 2 * i + 1, n);
	 }
	 return root;
}

现在插入顺序为 'A', 'B', 'C', 'D', 'E', 'F', ‘G’ 插入后的二叉树如下:

image-20220214211753753

完整代码如下:

#include<iostream>
using namespace std;
typedef char Type;
struct node {
	Type data;
	node* lchild;
	node* rchild;
}; 

node* create(Type x) {	//创建一个结点
	node* n = new node;
	n->data = x;
	n->lchild = n->rchild = NULL;
	return n;
}


//通过 arr[i] 元素创建 root 结点,注意是 root 地址的引用
node* insertLeverOrder(Type arr[], node* &root, int i, int n) {	 
	 if(i < n) {
	 	node* temp = create(arr[i]);
	 	root = temp;
	 	root->lchild = insertLeverOrder(arr, root->lchild, 2 * i, n);
	 	root->rchild = insertLeverOrder(arr, root->rchild, 2 * i + 1, n);
	 }
	 return root;
}
//中序遍历 
void inorder(node* root) {
	if(root == NULL) {
		return;
	}
	
	inorder(root->lchild);
	printf("%c\n", root->data);
	inorder(root->rchild); 
}

int main() {
    //第一个位置不放元素,因为下标为 0 则不能访问其左孩子结点(2 * i = 0)
	Type data[8] = {'0', 'A', 'B', 'C', 'D', 'E', 'F', 'G'};
	node* root = insertLeverOrder(data, root, 1, 8);
	inorder(root);
	return 0;
}

当然使用静态存储方式实现更加简单,即使用数组存储二叉树,若某结点在数组中位置为 i,其左孩子结点和右孩子结点分别为 2 * i 和 2 * i + 1;就不需要使用指针了;

原文地址:https://www.cnblogs.com/max-Ernest/p/15916616.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于nodejs...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs怎么实现目录不存在自动创建”文章能帮助大...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs如何实现定时删除文件”文章能帮助大家解决疑惑...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文...
本篇内容主要讲解“怎么安装Node.js的旧版本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎...
这篇“node中的Express框架怎么安装使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家...
这篇文章主要介绍“nodejs如何实现搜索引擎”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs如何实现搜索引擎...
这篇文章主要介绍“nodejs中间层如何设置”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs中间层如何设置”文...
这篇文章主要介绍“nodejs多线程怎么实现”,在日常操作中,相信很多人在nodejs多线程怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
这篇文章主要讲解了“nodejs怎么分布式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs怎么分布式”...
本篇内容介绍了“nodejs字符串怎么转换为数组”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情...
这篇文章主要介绍了nodejs如何运行在php服务器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇nodejs如何运行在php服务器文章都...
本篇内容主要讲解“nodejs单线程如何处理事件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“nodejs单线程如何...
这篇文章主要介绍“nodejs怎么安装ws模块”,在日常操作中,相信很多人在nodejs怎么安装ws模块问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
本篇内容介绍了“怎么打包nodejs代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!
本文小编为大家详细介绍“nodejs接收到的汉字乱码怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs接收到的汉字乱码怎么解决”文章能帮助大家解...
这篇“nodejs怎么同步删除文件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇...
今天小编给大家分享一下nodejs怎么设置淘宝镜像的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希