当前位置: 首页 > news >正文

数据结构与算法编程题23

设计二叉树的双序遍历算法(双序遍历是指对于二叉树的每一个结点来说,先访问这个结点,再按双序遍历它的左子树,然后再一次访问这个结点,接下来按双序遍历它的右子树)

#define _CRT_SECURE_NO_WARNINGS#include <iostream>
using namespace std;typedef char ElemType;
#define ERROR 0
#define OK 1
#define STR_SIZE 1024
typedef struct BiTNode
{ElemType data;BiTNode* lchild, * rchild;
}BiTNode, * BiTree;void draw(BiTNode* root);bool Create_tree(BiTree& T)
{ElemType x = 0;cin >> x;if (x == '#'){T = NULL;}else{T = (BiTree)malloc(sizeof(BiTNode));if (T == NULL){cout << "内存无法分配!!!" << endl;return ERROR;}T->data = x;T->lchild = NULL;T->rchild = NULL;Create_tree(T->lchild);Create_tree(T->rchild);}return OK;
}void PreOrder(BiTree T)
{if (T != NULL){cout << T->data;PreOrder(T->lchild);PreOrder(T->rchild);}
}void InOrder(BiTree T)
{if (T != NULL){InOrder(T->lchild);cout << T->data;InOrder(T->rchild);}
}void PostOrder(BiTree T)
{if (T != NULL){PostOrder(T->lchild);PostOrder(T->rchild);cout << T->data;}
}
//---------------------------------核心代码---------------------------------//
void shuangxubianli(BiTree T)
{if (T == NULL){return;}cout << T->data;shuangxubianli(T->lchild);cout << T->data;shuangxubianli(T->rchild);
}
//---------------------------------核心代码---------------------------------//
/*设计二叉树的双序遍历算法(双序遍历是指对于二叉树的每一个结点来说,先访问这个结点,再按双序遍
历它的左子树,然后再一次访问这个结点,接下来按双序遍历它的右子树)*/
//参考:https://www.bilibili.com/video/BV1n5411w72L/?spm_id_from=333.788&vd_source=efe4af6c91047f65ff265133037879f5
//ABC##D##EF##G##
int main(void)
{cout << "//------生成一颗树---------//" << endl;BiTree T = NULL;Create_tree(T);PreOrder(T);cout << endl;InOrder(T);cout << endl;PostOrder(T);cout << endl;cout << "//------生成一颗树---------//" << endl;cout << "//------原始树图形---------//" << endl;draw(T);shuangxubianli(T);//双序遍历操作return 0;
}//参考博客:https://blog.csdn.net/weixin_42109012/article/details/92250160
/*****************************************************************************
* @date   2020/4/19
* @brief  水平画树
* @param  node	二叉树节点
* @param  left	判断左右
* @param  str 	可变字符串
*****************************************************************************/
void draw_level(BiTNode* node, bool left, char* str) {if (node->rchild) {draw_level(node->rchild, false, strcat(str, (left ? "|     " : "      ")));}printf("%s", str);printf("%c", (left ? '\\' : '/'));printf("-----");printf("%c\n", node->data);if (node->lchild) {draw_level(node->lchild, true, strcat(str, (left ? "      " : "|     ")));}//  "      " : "|     " 长度为 6str[strlen(str) - 6] = '\0';
}/*****************************************************************************
* @date   2020/4/19
* @brief  根节点画树
* @param  root	二叉树根节点
*****************************************************************************/
void draw(BiTNode* root) {char str[STR_SIZE];memset(str, '\0', STR_SIZE);/*** 1. 在 windows 下,下面是可执行的* 2. 在 Linux   下,执行会报 Segmentation fault*      需要使用中间变量*/if (root->rchild) {draw_level(root->rchild, false, str);}printf("%c\n", root->data);if (root->lchild) {draw_level(root->lchild, true, str);}
}

在这里插入图片描述

http://www.lryc.cn/news/242791.html

相关文章:

  • 小程序中的大道理之二--抽象与封装
  • 基于卷积神经网络CNN开发构建HAR人类行为识别Human Activity Recognition【完整代码实践】
  • excel自己记录
  • vcsa6.7 5480无法登录
  • CSS 属性列表
  • 浅谈能源智能管理系统在大学高校中的应用
  • 脚本自动化定制开发:实现高效工作的魔法钥匙
  • 使用websocket获取thingsboard设备的实时数据
  • 使用Linux JumpServer堡垒机本地部署与远程访问
  • js的防抖与节流
  • 中职组网络安全-Windows操作系统渗透测试 -20221219win(环境+解析)
  • git本地账户如何从一台电脑迁移到另外一台
  • HOOPS Web平台助力开发3D应用,实现超大规模3D web轻量化渲染与数据格式转换!
  • GDB Debugging Notes
  • Azure Machine Learning - 创建Azure AI搜索服务
  • 鸿蒙(HarmonyOS)应用开发——安装DevEco Studio安装
  • 成都数字孪生技术推进制造业升级,工业物联网可视化应用加速
  • 管理类联考——数学——汇总篇——知识点突破——代数——函数——记忆
  • Flash Attention:高效注意力机制的突破与应用
  • Flutter开发警告Constructors in ‘@immutable‘ classes should be declared as ‘const‘
  • 想当老师应该去学什么专业
  • 【LM、LLM】浅尝二叉树在前馈神经网络上的应用
  • 鸿蒙4.0开发笔记之ArkTs语言基础与基本组件结构(四)
  • Another app is currently holding the yum lock; waiting for it to exit...
  • size和shape的区别与联系
  • 浅谈STL中的分配器
  • 禁止指定电脑程序运行的2种方法
  • 【Redis】前言--redis产生的背景以及过程
  • Java面试-微服务篇-SpringCloud
  • Git使用详解