IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> ?将树转化为二叉树代码实现? -> 正文阅读

[数据结构与算法]?将树转化为二叉树代码实现?

核心思路是在插入的时候,如果儿子结点为空,就将新结点插入儿子节点的的位置,如果儿子结点不为空,就将新结点作为兄弟结点插入兄弟节点的位置。插入的数据哪来,其实就是普通树的数据。下面代码是直接输入结点数据了。(估计这节的内容不太会考)

#include<iostream>
using namespace std;

//定义了一个名为pSTreeNode的指针类型, 它指向结构体STreeNode
typedef struct STreeNode *pSTreeNode;
// 定义了一个名为TreeDataType的int类型
typedef int TreeDataType;

//定义树节点结构体
struct STreeNode {
    TreeDataType data;
    pSTreeNode pFirstChild;
    pSTreeNode pNextBrother;
    //下面注释的定义其实是和上面的定义等价的
    //int data;
    //STreeNode* pFirstChild;
    //STreeNode* pNextBrother;

    //结构体构造函数
    STreeNode(TreeDataType Value) {
        data = Value;
        pFirstChild = NULL;
        pNextBrother = NULL;
    }
};

//定义类
class CTree{
public:
    pSTreeNode pRoot;

    CTree(){
        pRoot = NULL;
    }
    CTree(TreeDataType Value){
        pRoot = new STreeNode(Value);
    }
    ~CTree(){
        if (pRoot == NULL)
            return;
        FreeMemory(pRoot);
    }
    //该函数是为了插入子结点或兄弟结点
    //parentValue:该点的父亲节点;Value:该点的值
    void Insert(TreeDataType parentValue, TreeDataType Value){
        if(pRoot==NULL)
            return;
        //先找出父亲节点
        pSTreeNode pFindNode = Search(pRoot, parentValue);
        //父结点为空,说明插不进去,直接返回
        if(pFindNode == NULL)
            return;
        //父结点不为空,父结点的左孩子为空
        if(pFindNode->pFirstChild == NULL){
            pFindNode->pFirstChild = new STreeNode(Value);
            return;
        }else{
            //父结点不空,父结点的左孩子也不空,那么插入右兄弟即可
            //注意该函数左边传入的参数,传入的是左结点(左结点作为父亲啦!)
            InsertBrother(pFindNode->pFirstChild, Value);
            return;
        }
    }
    //插入右兄弟节点
    void InsertBrother(pSTreeNode pBrotherNode, TreeDataType Value){
        //传入的父亲已经有兄弟结点了,那么将该兄弟结点作为父亲传入下一个插入右节点的函数中
        if(pBrotherNode->pNextBrother != NULL)
            InsertBrother(pBrotherNode->pNextBrother, Value);
        else {
            //传入的父亲的兄弟节点还是空的,直接插入即可
            pBrotherNode->pNextBrother = new STreeNode(Value);
            return;
        }
    }
    //查找函数
    pSTreeNode Search(pSTreeNode pNode, TreeDataType Value){
        if (pNode == NULL)
            return NULL;
        //直接根节点就是所找,返回根节点
        if (pNode->data == Value)
            return pNode;
        //除了根节点就没有其他节点了
        if (pNode->pFirstChild==NULL && pNode->pNextBrother == NULL)
            return NULL;
        else{
            if (pNode->pFirstChild != NULL) {
                //左结点不为空,直接递归搜索左结点
                pSTreeNode pNodeTemp = Search(pNode->pFirstChild, Value);
                if (pNodeTemp != NULL)
                    return pNodeTemp;
                else {
                    //左结点为空,那么就递归搜索右兄弟
                    return Search(pNode->pNextBrother, Value);
                }
            }
            else
                return Search(pNode->pNextBrother, Value);
        }
    }
    //前序遍历
    void Preorder(pSTreeNode pNode){
        if(pNode == NULL)
            return;
        cout << " " << pNode->data << " ";
        Preorder(pNode->pFirstChild);
        Preorder(pNode->pNextBrother);
    }
    //中序遍历
    void Inorder(pSTreeNode pNode){
        if (pNode == NULL)
            return;
        Inorder(pNode->pFirstChild);
        cout << " " << pNode->data << " ";
        Inorder(pNode->pNextBrother);
    }
    //后序遍历
    void postorder(pSTreeNode pNode){
        if (pNode == NULL)
            return;
        postorder(pNode->pFirstChild);
        postorder(pNode->pNextBrother);
        cout<<" "<<pNode->data<<" ";
    }
    //释放堆内存
    void FreeMemory(pSTreeNode pNode){
        if(pNode == NULL)
            return;
        if(pNode->pFirstChild != NULL)
            FreeMemory(pNode->pFirstChild);
        if(pNode->pNextBrother != NULL)
            FreeMemory(pNode->pNextBrother);
        delete pNode;
        pNode = NULL;
    }
};

//主函数
int main(){
    CTree *pTree = new CTree(1);
    pTree->Insert(1, 2);
    pTree->Insert(1, 3);
    pTree->Insert(1, 4);
    pTree->Insert(1, 5);
    pTree->Insert(1, 6);
    pTree->Insert(1, 7);
    pTree->Insert(4, 8);
    pTree->Insert(5, 9);
    pTree->Insert(5, 10);
    pTree->Insert(6, 11);
    pTree->Insert(6, 12);
    pTree->Insert(6, 13);
    pTree->Insert(10, 14);
    pTree->Insert(10, 15);
    cout << "前序遍历:" << endl;
    pTree->Preorder(pTree->pRoot);
    cout << endl;
    cout << "中序遍历:" << endl;
    pTree->Inorder(pTree->pRoot);
    cout << endl;
    cout << "后序遍历:" << endl;
    pTree->postorder(pTree->pRoot);
    cout << endl;
    delete pTree;
    pTree = NULL;
    return 0;
}

我是花花,祝自己也祝您变强了~

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-26 12:25:59  更:2021-10-26 12:26:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:50:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码