c++,二叉树

#include <iostream>

#include <algorithm>

#include <string>

#include <cmath>

#include <time.h>

using namespace std;

typedef struct Node {

int key,ltag,rtag;

Node *lchild,*rchild;

} Node;

Node *getNewNode(int key) {

Node *p=(Node*)malloc(sizeof(Node));

p->key=key;

p->ltag=p->rtag=0;

p->lchild=p->rchild=NULL;

return p;

}

Node *insert(Node *root,int key) {

if(!root)return getNewNode(key);

if(rand()%2)root->lchild=insert(root->lchild,key);

else root->rchild=insert(root->rchild,key);

return root;

}

void clear(Node *root) {

if(!root)return ;

clear(root->lchild);

clear(root->rchild);

free(root);

return ;

}

void pre_order(Node *root) {

if(!root)return ;

cout<<root->key<<" ";

if(!root->ltag)pre_order(root->lchild);

if(!root->rtag)pre_order(root->rchild);

return ;

}

void in_order(Node *root) {

if(!root)return ;

if(!root->ltag)in_order(root->lchild);

cout<<root->key<<" ";

if(!root->rtag)in_order(root->rchild);

return ;

}

void post_order(Node *root) {

if(!root)return ;

if(!root->ltag)post_order(root->lchild);

if(!root->rtag)post_order(root->rchild);

cout<<root->key<<" ";

return ;

}

Node *pre_node=NULL,*inorder_root=NULL;

void __build_inorder_thread(Node *root) {

if(!root)return ;

if(!root->ltag)__build_inorder_thread(root->lchild);

if(inorder_root==NULL)inorder_root=root;

if(root->lchild==NULL) {

root->lchild=pre_node;

root->ltag=1;

}

if(pre_node&&pre_node->rchild==NULL) {

pre_node->rchild=root;

pre_node->rtag=1;

}

pre_node=root;

if(!root->rtag)__build_inorder_thread(root->rchild);

return ;

}

void build_inorder_thread(Node *root) {

__build_inorder_thread(root);

pre_node->rchild=NULL;

pre_node->rtag=1;

return ;

}

Node *getNext(Node *root){

if(root->rtag==1)return root->rchild;

root=root->rchild;

while(root->ltag==0&&root->lchild)root=root->lchild;

return root;

}

int main() {

srand(time(0));

Node *root=NULL;

for(int i=0; i<10; i++) {

root=insert(root,rand()%100);

}

pre_node=inorder_root=NULL;

build_inorder_thread(root);

pre_order(root);

printf("\n");

in_order(root);

printf("\n");

post_order(root);

cout<<endl;

Node *node=inorder_root;

while(node) {

cout<<node->key<<" ";

node=getNext(node);

}

clear(root);

return 0;

}

相关推荐
元亓亓亓43 分钟前
LeetCode热题100--230. 二叉搜索树中第 K 小的元素--中等
算法·leetcode·职场和发展
草莓熊Lotso43 分钟前
《算法闯关指南:优选算法-双指针》--01移动零,02复写零
c语言·c++·经验分享·算法·leetcode
焜昱错眩..2 小时前
代码随想录算法训练营第三十九天|62.不同路径 63.不同路径ll
算法
ajassi20005 小时前
开源 C++ QT Widget 开发(十五)多媒体--音频播放
linux·c++·qt·开源
焦耳加热5 小时前
阿德莱德大学Nat. Commun.:盐模板策略实现废弃塑料到单原子催化剂的高值转化,推动环境与能源催化应用
人工智能·算法·机器学习·能源·材料工程
wan5555cn5 小时前
多张图片生成视频模型技术深度解析
人工智能·笔记·深度学习·算法·音视频
u6066 小时前
常用排序算法核心知识点梳理
算法·排序
鹅毛在路上了7 小时前
C++, ffmpeg, libavcodec-RTSP拉流,opencv实时预览
c++·opencv·ffmpeg
John_ToDebug7 小时前
定制 ResourceBundle 的实现与 DuiLib 思想在 Chromium 架构下的应用解析
c++·chrome·ui
蒋星熠8 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程