【数据结构】顺序查找树节点计算思路与遍历详解

简介: 【数据结构】顺序查找树节点计算思路与遍历详解

顺序存储二叉树

顺序存储二叉树的概念

从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,

2.png



上图的二叉树的结点,要求以数组的方式来存放 arr : [1, 2, 3, 4, 5, 6, 6] 2) 要求在遍历数组 arr 时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历


顺序存储二叉树的特点:

顺序二叉树通常只考虑完全二叉树

第 n 个元素的左子节点为 2 * n + 1(计算公式)

第 n 个元素的右子节点为 2 * n + 2 (计算公式)

第 n 个元素的父节点为 (n-1) / 2

n : 表示二叉树中的第几个元素


顺序存储二叉树遍历

需求


给你一个数组 {1,2,3,4,5,6,7},要求以二叉树前序遍历的方式进行遍历。


前序遍历的结果应当为 1,2,4,5,3,6,7


编码思路


这里判断的思路首先是有一个数组转变成树看待的思想,


数组 : 1,2,3,4,5,6,7


树 (如下图)

2.png



第 n 个元素的左子节点为 2 * n + 1(计算公式)

第 n 个元素的右子节点为 2 * n + 2 (计算公式)

我们可以用这个公式来证明一下,数组转树的正确性


比如我们要计算二的位置,2是1的左子节点,1是下标为0的元素 2*0+1 套用公式 = 1,之后的节点同理


代码实现

package com.hyc.DataStructure.tree;
/**
 * @projectName: DataStructure
 * @package: com.hyc.DataStructure.tree
 * @className: ArrayTreeDemo
 * @author: 冷环渊 doomwatcher
 * @description: TODO
 * @date: 2022/2/4 19:07
 * @version: 1.0
 */
public class ArrayTreeDemo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7};
        ArrayTree arrayTree = new ArrayTree(arr);
        //452 6731
        arrayTree.postOrder(0);
    }
}
class ArrayTree {
    private int[] arr;
    public ArrayTree(int[] arr) {
        this.arr = arr;
    }
    //    顺序存储树的前序遍历
    // 遍历公式 找到n的第n个左结点 n*2+1 找到n的第n个右节点 n*2+2
    // 输入参数 int index 为开始遍历到根节点 即为 数组下标0
    public void preOrder(int index) {
        //非空判断 避免空指针
        if (arr == null || arr.length == 0) {
            System.out.println("该树 为空 不能遍历");
        }
        //    前序遍历先输出自己
        System.out.println(arr[index]);
        //    之后递归遍历左结点
        //判断index 是否越界
        if ((2 * index + 1) < arr.length) {
            preOrder(index * 2 + 1);
        }
        //    之后递归遍历右边结点
        //判断index 是否越界
        if ((2 * index + 2) < arr.length) {
            preOrder(index * 2 + 2);
        }
    }
    public void infixOrder(int index) {
        //非空判断 避免空指针
        if (arr == null || arr.length == 0) {
            System.out.println("该树 为空 不能遍历");
        }
        //    递归遍历左结点
        //判断index 是否越界
        if ((2 * index + 1) < arr.length) {
            infixOrder(index * 2 + 1);
        }
        //    中序遍历输出自己
        System.out.println(arr[index]);
        //    递归遍历右边结点
        //判断index 是否越界
        if ((2 * index + 2) < arr.length) {
            infixOrder(index * 2 + 2);
        }
    }
    public void postOrder(int index) {
        //非空判断 避免空指针
        if (arr == null || arr.length == 0) {
            System.out.println("该树 为空 不能遍历");
        }
        //    递归遍历左结点
        //判断index 是否越界
        if ((2 * index + 1) < arr.length) {
            postOrder(index * 2 + 1);
        }
        //    递归遍历右边结点
        //判断index 是否越界
        if ((2 * index + 2) < arr.length) {
            postOrder(index * 2 + 2);
        }
        //    后序遍历输出自己
        System.out.println(arr[index]);
    }
}

这里我们先了解顺序存储二叉树,并且掌握他的节点计算思路和遍历思路


目录
打赏
0
0
0
0
6
分享
相关文章
|
2月前
|
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
69 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
2月前
|
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
59 12
|
2月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
53 10
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
55 2
【C++数据结构——图】图的遍历(头歌教学实验平台习题) 【合集】
本文介绍了图的遍历算法,包括深度优先遍历(DFS)和广度优先遍历(BFS)。深度优先遍历通过递归方式从起始节点深入探索图,适用于寻找路径、拓扑排序等场景;广度优先遍历则按层次逐层访问节点,适合无权图最短路径和网络爬虫等应用。文中提供了C++代码示例,演示了如何实现这两种遍历方法,并附有测试用例及结果,帮助读者理解和实践图的遍历算法。
49 0
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
104 5
|
4月前
|
数据结构之文件系统模拟(树数据结构)
本文介绍了文件系统模拟及其核心概念,包括树状数据结构、节点结构、文件系统类和相关操作。通过构建虚拟环境,模拟文件的创建、删除、移动、搜索等操作,展示了文件系统的基本功能和性能。代码示例演示了这些操作的具体实现,包括文件和目录的创建、移动和删除。文章还讨论了该算法的优势和局限性,如灵活性高但节点移除效率低等问题。
97 0
|
4月前
|
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
375 9
|
4月前
|
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
64 1
|
2月前
|
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
158 77
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等