• 二叉树数组C++实现


    基本概念梳理

    1. 孩子:子结点
    2. 双亲:父节点
    3. 度:有多少个子结点
    4. 有序树:固定的排列的树
    5. 无序树:排列与顺序无关的树
    6. 二叉树:所有结点小于等于2的树

    源代码:https://github.com/cjy513203427/C_Program_Base/tree/master/56.%E4%BA%8C%E5%8F%89%E6%A0%91%E6%95%B0%E7%BB%84%E5%AE%9E%E7%8E%B0

    需要实现的方法

    #pragma once
    #ifndef TREE_H
    #define TREE_H
    
    class Tree
    {
    public:
        Tree(int size,int *pRoot);//创建树
        ~Tree();//销毁树
        int *SearchNode(int nodeIndex);//根据索引寻找结点
        bool AddNode(int nodeIndex, int direction, int *pNode);//添加结点
        bool DeleteNode(int nodeIndex, int *pNode);//删除结点
        void TreeTraverse();//遍历
    private:
        int *m_pTree;
        int m_iSize;
    };
    
    #endif // !TREE_H

    1.创建树

    传入数组容量和根节点地址

    m_iSize和m_pTree初始化

    将数组都置为0初始化

    pRoot指向的内存单元的树值赋值数组首元素(根元素)

    Tree::Tree(int size, int *pRoot)
    {
        m_iSize = size;
        m_pTree = new int[m_iSize];
        for (int i = 0; i < m_iSize; i++)
        {
            m_pTree[i] = 0;
        }
        m_pTree[0] = *pRoot;
    }

     2.销毁树

    删除指针并置空

    Tree::~Tree()
    {
        delete []m_pTree;
        m_pTree = NULL;
    }

    3.根据索引寻找结点

    先判断索引的合法性,索引不能小于0或者大于等于长度

    传入数组的值不能等于0

    返回该数组地址

    int *Tree::SearchNode(int nodeIndex)
    {
        if (nodeIndex<0 || nodeIndex>=m_iSize)
        {
            return NULL;
        }
        if (m_pTree[nodeIndex] == 0)
        {
            return NULL;
        }
        return &m_pTree[nodeIndex];
    }

    4.添加结点

    判断索引合法性,和3.一样

    direction = 0代表添加左子节点,direction = 1代表添加右子节点

    左子节点 = 2*索引+1;右子节点 = 2*索引+2

    下图可以验证

    继续判断索引的合法性,左子节点和右子节点同样不能小于0或者大于等于数组长度

    最后将*pNode赋值给子节点

    bool Tree::AddNode(int nodeIndex, int direction, int *pNode)
    {
        if (nodeIndex<0 || nodeIndex >= m_iSize)
        {
            return false;
        }
        if (m_pTree[nodeIndex] == 0)
        {
            return false;
        }
        if (direction == 0)
        {
            //nodeIndex * 2 + 1<0可以省略
            if (nodeIndex * 2 + 1<0 || nodeIndex * 2 + 1 >= m_iSize)
            {
                return false;
            }
            //判断是否有左子节点
            if (m_pTree[nodeIndex * 2 + 1] != 0)
            {
                return false;
            }
            m_pTree[nodeIndex * 2 + 1] = *pNode;
        }
        if (direction == 1)
        {
            //nodeIndex * 2 + 2<0可以省略
            if (nodeIndex * 2 + 2<0 || nodeIndex * 2 + 2 >= m_iSize)
            {
                return false;
            }
            //判断是否有左子节点
            if (m_pTree[nodeIndex * 2 + 2] != 0)
            {
                return false;
            }
            m_pTree[nodeIndex * 2 + 2] = *pNode;
        }
        return true;
    }

     5.删除结点

    判断索引和数组值的合法性

    将*pNode接收删除的对应索引的数组

    将该索引数组置为0,结点值等于0代表删除

    返回正确结果

    bool Tree::DeleteNode(int nodeIndex, int *pNode)
    {
        if (nodeIndex<0 || nodeIndex >= m_iSize)
        {
            return false;
        }
        if (m_pTree[nodeIndex] == 0)
        {
            return false;
        }
        *pNode = m_pTree[nodeIndex];
        m_pTree[nodeIndex] = 0;
        return true;
    }

    6.遍历

    没啥好说的

    void Tree::TreeTraverse()
    {
        for (int i = 0; i < m_iSize; i++)
        {
            cout << m_pTree[i] << " ";
        }
    }
  • 相关阅读:
    调查问卷
    SQL 基础学习(1):下载DB Browser for SQLite. 下载graphviz(为了使用Rails ERD的前提)出现❌,已debug.
    路由完整实例代码
    如何自定义JSTL标签与SpringMVC 标签的属性中套JSTL标签报错的解决方法
    CSS样式表、JS脚本加载顺序与SpringMVC在URL路径中传参数与SpringMVC 拦截器
    SpringMVC的解释与搭建Maven私有代理服务器
    单调队列 bzoj3126 [Usaco2013 Open]Photo
    二分图 crf的军训
    单调队列 JC loves Mkk
    测试开发CICD——Git——window上安装git——配置基本信息
  • 原文地址:https://www.cnblogs.com/Java-Starter/p/9439716.html
Copyright © 2020-2023  润新知