網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
完整二叉樹的創(chuàng)建
思路:主要是利用遞歸的思想創(chuàng)建的,先不斷調(diào)用該函數(shù)創(chuàng)建左子樹,等創(chuàng)建到最后一個(gè)左子樹的時(shí)候就開始往回創(chuàng)建右子樹。
注意:pos要從1開始
p->lchild=CreateBinTree(nodes,2*pos, num);
p->rchild=CreateBinTree(nodes,2*pos+1, num);
二叉樹的二叉鏈表存儲(chǔ)結(jié)構(gòu)
#define N 100
typedef char DATATYPE;
typedef struct Node
{
DATATYPE data; // 數(shù)據(jù)域
struct Node *lchild; // 左孩子指針域
struct Node *rchild; // 右孩子指針域
}BTNode,*PBTNode,*BiTreeLink;
創(chuàng)建二叉樹
BiTreeLink CreateBinTree(char *nodes,int pos,int num)//pos是節(jié)點(diǎn)號(hào),num為該二叉樹總結(jié)點(diǎn)數(shù),nodes要存入的數(shù)據(jù)
{
PBTNode p;
if(nodes[pos]==' '||pos>num) // 遞歸結(jié)束條件
return NULL;
p = (PBTNode)malloc(sizeof(BTNode)); // 建立根結(jié)點(diǎn)
if(!p) 判斷結(jié)點(diǎn)是否創(chuàng)建成功
{
printf("創(chuàng)建根結(jié)點(diǎn)失敗!\n");
return 0;
}
p->data = nodes[pos]; // 將數(shù)據(jù)存入數(shù)據(jù)域
p->lchild=CreateBinTree(nodes,2*pos, num); // 利用遞歸建立左子樹
p->rchild=CreateBinTree(nodes,2*pos+1, num); // 利用遞歸建立右子樹
return p;
}
遍歷的大概思路:
主要是訪問(wèn)根的順序,
樹的前序遍歷
口訣:根左右
原理:
1.訪問(wèn)根節(jié)點(diǎn)
2.前序遍歷根結(jié)點(diǎn)的左子樹
3.前序遍歷根節(jié)點(diǎn)的右子樹
void preOrder(BTNode *p)
{
if(p != NULL)
{
printf("%c ",p->data);//根
preOrder(p->lchild);//訪問(wèn)根的左子樹
preOrder(p->rchild);//訪問(wèn)根的右子樹
}
}
二叉樹中序遍歷
口訣就是:左根右
原理:
1.中序遍歷根結(jié)點(diǎn)的左子樹
2.訪問(wèn)根節(jié)點(diǎn)
3.中序遍歷根節(jié)點(diǎn)的右子樹
void inOrder(BTNode *p)
{
if(p!=NULL)
{
inorder(p->lchild); //訪問(wèn)根的左子樹
printf("%c ",p->data);
inorder(p->rchild);//訪問(wèn)根的右子樹
}
}
二叉樹的后序遍歷
口訣就是:左右根
原理:
1.后序遍歷根結(jié)點(diǎn)的左子樹
2.后序遍歷根節(jié)點(diǎn)的右子樹
3.訪問(wèn)根節(jié)點(diǎn)
void postOrder(BTNode *p)
{
if(p != NULL)
{
postOrder(p->lchild);//訪問(wèn)根的左子樹
postOrder(p->rchild);//訪問(wèn)根的右子樹
printf("%c ",p->data);//根
}
}
主函數(shù)
void main()
{
int i;
BiTreeLink tree;
int length;
char nodes[N],str[N];
gets(str); // 獲取用戶輸入序列
length = strlen(str);
for (i = 0; i < length;i++)
{
if (str[i] == ' ') // 檢查用戶輸入是否有空格
{
nodes[i+1] = '*'; // 如有空格則用*代替
}
else // 否則按照實(shí)際輸入存儲(chǔ)
{
nodes[i+1] = str[i];
}
}
tree = CreateBinTree(nodes,1,length); // 創(chuàng)建二叉樹
preOrder(tree); // 前序遍歷
inOrder(tree); // 中序遍歷
postOrder(tree); // 后序遍歷
}
原文鏈接:https://blog.csdn.net/smallcabbage12/article/details/125750790
相關(guān)推薦
- 2022-05-18 C語(yǔ)言程序環(huán)境和預(yù)處理詳解分析_C 語(yǔ)言
- 2022-08-21 深入了解C語(yǔ)言中常見的文件操作方法_C 語(yǔ)言
- 2023-07-29 iview的table動(dòng)態(tài)合并行列的完整示例
- 2023-02-14 詳解C/C++?Linux出錯(cuò)處理函數(shù)(strerror與perror)的使用_C 語(yǔ)言
- 2022-03-21 C語(yǔ)言打印正方形實(shí)例代碼_C 語(yǔ)言
- 2022-10-04 一文教會(huì)你用Python讀取PDF文件_python
- 2022-07-01 python神經(jīng)網(wǎng)絡(luò)Densenet模型復(fù)現(xiàn)詳解_python
- 2022-08-06 python練習(xí)之循環(huán)控制語(yǔ)句?break?與?continue_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支