简单二叉树相关代码

  1 #include <stdio.h>
  2
  3 typedef struct tagBinaryTree* Node;
  4 typedef struct tagBinaryTree BinaryTree;
  5
  6 struct tagBinaryTree{
  7     int key;
  8     Node lchild;
  9     Node rchild;
 10     Node parent;
 11 };
 12 typedef struct                          //定义栈的结构体
 13 {
 14     Node          *base;              //在栈构造前和销毁后,base的值为NULL
 15     Node          *top;               //栈顶指针
 16     int             stacksize;          //当前已分配的存储空间,以元素为单位
 17 }Stack;
 18 int Key(Node branch)
 19 {
 20     if(branch == NULL) return 0;
 21     return branch->key;
 22 }
 23
 24 Node Left(Node branch)
 25 {
 26     if(branch == NULL) return NULL;
 27     return branch->lchild;
 28 }
 29
 30 Node Right(Node branch)
 31 {
 32     if(branch == NULL) return NULL;
 33     return branch->rchild;
 34 }
 35
 36 Node Parent(Node branch)
 37 {
 38     if(branch == NULL) return NULL;
 39     return branch->parent;
 40 }
 41 Node LookUp(Node T, int key)
 42 {
 43     while(T != NULL && Key(T) != key){
 44         if(key < Key(T)){
 45             T = Left(T);
 46         }else{
 47             T = Right(T);
 48         }
 49     }
 50     return T;
 51 }
 52 Node CreateLeaf(int x, Node* T)
 53 {
 54     Node n = malloc(sizeof(BinaryTree));
 55     n->lchild = n->rchild = n->parent = NULL;
 56
 57     n->key = x;
 58     *T = n;
 59     return n;
 60 }
 61
 62 int InsertKey(int key, Node* T)
 63 {
 64     Node root = *T,parent = NULL,x = NULL;
 65     x = LookUp(*T, key);
 66     if(x != NULL) return 0;
 67     CreateLeaf(key, &x);
 68
 69     while(root != NULL){
 70         parent = root;
 71         if(key < Key(root)){
 72             root = Left(root);
 73         }else if(key > Key(root)){
 74             root = Right(root);
 75         }else{
 76             return 0;
 77         }
 78     }
 79     x->parent = parent;
 80
 81     if(parent == NULL) {
 82         *T = x;
 83         return 0;
 84     }else if(key < Key(parent)){
 85         parent->lchild = x;
 86     }else{
 87         parent->rchild= x;
 88     }
 89     return 0;
 90 }
 91
 92 int PreOrderTravel(Node T, Stack S)
 93 {
 94     while( S.base != S.top|| T != NULL)       //判断栈和树是否为空
 95     {
 96         while( T !=NULL )                  //向左子树一直循环到最左的节点
 97         {
 98             printf("%d ",T->key);      //输出元素
 99             *S.top++ = T;
100             T = T->lchild;
101         }
102         T = *--S.top;                     //实现出栈
103         T = T->rchild;                    //转向右子树
104     }
105     printf("\n");
106     return 0;
107 }
108 int InOder(Node T,Stack S)      //实现非递归中序遍历函数
109 {
110     while( S.base != S.top || T != NULL)       //判断栈和树是否为空
111     {
112         while(T!=NULL)                  //向左子树一直循环到最左的节点
113         {
114             *S.top++ = T;
115             T = T->lchild;
116         }
117         T = *--S.top;                     //实现出栈
118         printf("%d ", T->key);
119         T = T->rchild;                  //转向右子树
120     }
121     printf("\n");
122     return 0;
123 }
124
125 int PostOrder(Node T,Stack S)   //实现非递归后序遍历函数
126 {
127     Node temp=NULL;                   //定义临时变量,用来标记刚刚访问过的节点
128     while( S.base != S.top || T!= NULL )      //判断栈和树是否为空
129     {
130         while(T!=NULL)                  //向左子树一直循环到最左的节点
131         {
132             *S.top++ = T;
133             T = T->lchild;
134         }
135         T = *(S.top-1);                   //取栈顶节点
136         if( T->rchild == NULL || T->rchild == temp)
137         {                               //如果该节点没有右孩子或者其右孩子刚刚被访问过
138             printf("%d ",T->key);      //输出元素
139             S.top--;                    //已访问,使其出栈
140             temp=T;                     //标记为刚刚访问过
141             T=NULL;                     //若遍历完以该节点为根的子树,且栈空,则结束,否则继续
142         } else{
143             T = T->rchild;                    //转向右子树
144         }
145     }
146     printf("\n");
147     return 0;
148 }
149 int CreatStack(Stack* S)             //实现栈的建立函数
150 {
151     S->base=(Node*)malloc(100*sizeof(Node));
152     if(!S->base)                         //判断是否建立失败
153         return -1;
154     S->top=S->base;
155     S->stacksize=100;
156     return 0;
157 }
158 void DestoryStack(Stack* s)
159 {
160     if(!s || !s->base){
161         return ;
162     }
163     free(s->base);
164     memset(s, 0, sizeof(Stack));
165 }
166 Node FollowNode(Node T, int key)
167 {
168     Node cur = LookUp(T, key);
169
170     if(cur->rchild){
171         Node right = cur->rchild;
172         while(right->lchild != NULL){
173             right = right->lchild;
174         }
175         return right;
176     }else if(Parent(cur)){
177         Node parent= Parent(cur);
178         while(parent != NULL && Right(parent) == cur ){
179             cur=parent;
180             parent = Parent(parent);
181         }
182         return parent;
183     }
184     return NULL;
185 }
186
187 Node PreNode(Node T, int key)
188 {
189     Node cur = LookUp(T, key);
190     if(cur->lchild){
191         Node left = cur->lchild;
192         while(left->rchild != NULL){
193             left = left->rchild;
194         }
195         return left;
196     }else if(Parent(cur)){
197         Node parent = Parent(cur);
198         while(parent != NULL && Left(parent) == cur){
199             cur = parent;
200             parent = Parent(parent);
201         }
202         return parent;
203     }
204     return NULL;
205 }
206 Node DeleteNode(Node* T, int key)
207 {
208     Node cur = LookUp(*T, key);
209     Node root = *T,old_cur = cur,  parent = NULL;
210
211     if(root == NULL || cur == NULL){
212         return *T;
213     }
214     parent = cur->parent;
215     if(cur->lchild == NULL){
216         cur = cur->rchild;
217     }else if(cur->rchild == NULL){
218         cur = cur->lchild;
219     }else{
220         Node right = cur->rchild;
221         while(right->lchild != NULL){
222             right = right->lchild;
223         }
224         cur->key = right->key;
225         if(right->parent != cur){
226             right->parent->lchild = right->rchild;
227             if(right->rchild != NULL){
228                 right->rchild->parent = right->parent;
229             }
230         }else{
231             cur->rchild = right->rchild;
232             if(right->rchild != NULL){
233                 right->rchild->parent = right->parent;
234             }
235         }
236         free(right);
237         right = NULL;
238         return root;
239     }
240     if(cur != NULL){
241         cur->parent = parent;
242     }else{
243         //printf("cur is NULL\n");
244     }
245     if(root == old_cur && root->lchild == NULL && root->rchild == NULL){
246         *T = NULL;
247         //do nothing
248     }else if(parent == NULL){
249         *T =root = cur;
250     }else{
251         if(parent->lchild == old_cur){
252             parent->lchild = cur;
253         }else{
254             parent->rchild = cur;
255         }
256     }
257     free(old_cur);
258     old_cur = NULL;
259     return root;
260 }
261
262 int main(int argc, char** argv)
263 {
264     Node root = NULL, pNode = NULL;
265     Stack stack = {0};
266     int len = 0, i = 0;
267     unsigned int tdata[21] = {30, 11, 71, 15, 9, 31, 12, 24, 18,10, 3,13, 14,33,80, 47,8,5,6,26};
268     CreatStack(&stack);
269
270     while(i < 20){
271         InsertKey(tdata[i], &root);
272         i++;
273     }
274
275     PreOrderTravel(root, stack);
276     InOder(root,stack);
277     PostOrder(root,stack);
278
279     pNode = FollowNode(root, 30);
280     printf("30 follow node:%d\n", pNode->key);
281     pNode = PreNode(root, 47);
282     printf("47 pre node :%d\n", pNode->key);
283     DeleteNode(&root, 31);
284
285     PreOrderTravel(root, stack);
286     InOder(root,stack);
287     PostOrder(root,stack);
288     pNode = FollowNode(root, 30);
289     printf("30 follow node:%d\n", pNode->key);
290     pNode = PreNode(root, 47);
291     printf("47 pre node :%d\n", pNode->key);
292
293     i = 0;
294     while(i < 20){
295         DeleteNode(&root, tdata[i]);
296         i++;
297     }
298     DestoryStack(&stack);
299     return 0;
300 }

原文地址:https://www.cnblogs.com/chriszsy/p/9048731.html

时间: 2024-10-11 01:24:38

简单二叉树相关代码的相关文章

java实现二叉树相关代码-----数据结构

接口 /*1.开发时间:2014-11-5  *2.开发者:赵远  *3.维护者:赵远  *3.程序说明:树的接口  *4.注意事项:暂且没有  * **/ package Tree; import Tree.node; public interface TreeNode { // class Node {};  // 1. 求二叉树中的节点个数  int GetNodeNum(node root);  // 2. 求二叉树的深度  int GetDepth(node root);  // 3.

Javascript 实现简单计算器实例代码

Javascript 实现简单计算器实例代码 这篇文章主要介绍了Javascript 实现简单计算器实例代码的相关资料,需要的朋友可以参考下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

rabttmq php延迟消息 相关代码(网上没搜到自己琢磨着弄好了)

前言:  作为一个运维人员不背锅,谁背呢! 正文: 网上都是2种办法去实现,第二种我就不说了,要升级rabbitmq 别人也说什么什么不行 好吧~今天按照网上说的 TTL + DLX 的方式来实现 延迟消息(java的 python的相关代码都有 就是没有 拍huang片的!!!!) 撸代码咯: 1.首先得要创建一个新的队列 新的交换机来存放延迟消息 并且设置新的队列消息ttl到期后 转发的 交换机 和 routeing key (我的老的交换机为e_test  key 为k1) 主要代码为:

Kafka Producer相关代码分析

Kafka Producer相关代码分析 标签(空格分隔): kafka Kafka Producer将用户的消息发送到Kafka集群(准确讲是发送到Broker).本文将分析Producer相关的代码实现. 类kafka.producer.Producer 如果你自己实现Kafka客户端来发送消息的话,你就是用到这个类提供的接口来发送消息.(如果你对如何利用Producer API来发送消息还不是很熟悉的话,可以参看官方的例子).这个类提供了同步和异步两种方式来发送消息. 异步发送消息是基于同

使用Mybatis Generator自动生成Mybatis相关代码

本文将简要介绍怎样利用Mybatis Generator自动生成Mybatis的相关代码: 一.构建一个环境: 1. 首先创建一个表: Sql代码   CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), species VARCHAR(20), sex CHAR(1), birth DATE, death DATE); 2. 然后注入数据 Sql代码   insert into pet values('Fluffy', 'Harold',

DataNode与NameNode交互机制相关代码分析

HDFS Federation是为解决HDFS单点故障而提出的NameNode水平扩展方案,该方案允许HDFS创建多个Namespace以提高集群的扩展性和隔离性.在Federation中新增了block-pool的概念,block-pool就是属于单个Namespace的一组block,每个DataNode为所有的block-pool存储block,可以理解block-pool是一个重新将block划分的逻辑概念,同一个DataNode中可以存储属于多个block-pool的多个block.所

ios 网络请求总结加强对中文的处理 问题:URL不允许写中文 在GET请求中,相关代码段打断点以验证。

开发还是需要多多练习的 ,下面是一些常用的步骤: 一.简单说明 创建Get 请求 //    1.设置请求路径 NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text]; NSURL *url=[NSURL URLWithString:urlStr]; //

ViewModel 实践:高效简单地组织代码

转载自:http://www.cocoachina.com/ios/20150714/12447.html 文/某鸟 前言 不知不觉,笔者也撸码也已经一年多了.随着撸码的数量疾速上涨,如何高效,简单的组织代码,经常引起笔者的思考.作为一个方法论及其实践者(这个定义是笔者自己胡诌的),始终希望能够找到一些简单.有效的方法来解决问题,由此,也开始了一段构建代码的实践体验. 这次要分享的,是自己在长期实践 MVVM 结构后,对 MVVM 框架的一些理解与自己的工作流程.其中或许还有一些地方拿捏欠妥,希

SOCKET简单爬虫实现代码和使用方法

抓取一个网页内容非常容易,常见的方式有curl.file_get_contents.socket以及文件操作函数file.fopen等. 下面使用SOCKET下的fsockopen()函数访问Web服务器最常用的80端口,通过获取80端口的数据,并进行分析,来模拟网络爬虫的工作方法. 1.实现SOCKET模拟网络爬虫主要包括以下几个部分: 使用SOCKET获取指定页的内容. 使用get_meta_tags()函数分析网页的META.TITLE等标签内容. 解析TITLE.链接或网页内容,可以使用