编程语言
首页 > 编程语言> > C语言- 基础数据结构和算法 - 13 二叉树非递归遍历(链式栈)20220612

C语言- 基础数据结构和算法 - 13 二叉树非递归遍历(链式栈)20220612

作者:互联网

13 二叉树非递归遍历(链式栈)20220612,

听黑马程序员教程《基础数据结构和算法 (C版本)》,

照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1

喜欢的朋友可以去看看,欢迎大家一起交流学习。

13 二叉树非递归遍历(链式栈)20220612_main.c

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 
  5 #include "LinkStack.c"
  6 
  7 // 标识
  8 #define MY_FALSE 0
  9 #define MY_TRUE  1
 10 
 11  
 12 // 二叉树结点 
 13 typedef struct BINARYNODE{
 14     char ch;
 15     struct BINARYNODE* lchild;        // 左结点
 16     struct BINARYNODE* rchild;        // 右结点 
 17 }BinaryNode;
 18 
 19 
 20 typedef struct BITREESTACKNODE{
 21     LinkNode node;
 22     BinaryNode* root;
 23     int flag;
 24 }BiTreeStackNode;
 25 
 26 // 创建栈中的结点
 27 BiTreeStackNode* CreateBiTreeStackNode(BinaryNode* node,int flag){
 28     
 29     BiTreeStackNode* newnode = (BiTreeStackNode*)malloc(sizeof(BiTreeStackNode));
 30     newnode->root= node;
 31     newnode->flag = flag;
 32     
 33     return newnode;
 34 } 
 35 
 36 // 二叉树的非递归遍历(栈方式)
 37 void NonRecursion(BinaryNode* root){
 38     
 39     // 创建栈
 40     LinkStack* stack = Init_LinkStack();
 41     // 把根结点扔栈里
 42     Push_LinkStack(stack,(LinkNode*)CreateBiTreeStackNode(root,MY_FALSE));
 43     
 44     while(Size_LinkStack(stack) > 0){
 45         
 46         // 先弹出栈顶元素
 47         BiTreeStackNode* node = (BiTreeStackNode*)Top_LinkStack(stack);
 48         Pop_LinkStack(stack);
 49         
 50         // 判断弹出的结点是否为空
 51         if(node->root == NULL){
 52             continue;        // 跳出本次循环(后面代码不执行了),直接进行下一次循环。 
 53         }
 54         if(node->flag == MY_TRUE){
 55             printf("%c ",node->root->ch);
 56         }
 57         else{
 58             // 先序遍历,按下面R-L-D步,中序遍历按R-D-L顺序,后序遍历按D-R-L
 59             // 因为栈是后进先出,所以入栈步骤要与之(先序、中序、后序)相反。 
 60             // R、当前节点的右结点入栈 
 61             Push_LinkStack(stack,(LinkNode*)CreateBiTreeStackNode(node->root->rchild,MY_FALSE));
 62             // L、当前节点的左结点入栈
 63             Push_LinkStack(stack,(LinkNode*)CreateBiTreeStackNode(node->root->lchild,MY_FALSE)); 
 64             // D、改变当前节点的flag标识,并入栈
 65             node->flag = MY_TRUE;
 66             Push_LinkStack(stack,(LinkNode*)node);
 67         }
 68         
 69     }
 70 }
 71 
 72 
 73  
 74 // 手动构建二叉树
 75 void CresteBinaryTree(){
 76     // 共8个结点
 77     BinaryNode nodeA = {'A',NULL,NULL};
 78     BinaryNode nodeB = {'B',NULL,NULL};
 79     BinaryNode nodeC = {'C',NULL,NULL};
 80     BinaryNode nodeD = {'D',NULL,NULL};
 81     BinaryNode nodeE = {'E',NULL,NULL};
 82     BinaryNode nodeF = {'F',NULL,NULL};
 83     BinaryNode nodeG = {'G',NULL,NULL};
 84     BinaryNode nodeH = {'H',NULL,NULL};
 85     //BinaryNode nodeI = {'I',NULL,NULL};
 86     //BinaryNode nodeJ = {'J',NULL,NULL};
 87     // 节点关系
 88     nodeA.lchild = &nodeB;
 89     nodeA.rchild = &nodeF;
 90     nodeB.rchild = &nodeC;
 91     nodeC.lchild = &nodeD;
 92     nodeC.rchild = &nodeE;
 93     nodeF.rchild = &nodeG;
 94     nodeG.lchild = &nodeH; 
 95 //    nodeH.lchild = &nodeI;
 96 //    nodeI.lchild = &nodeJ;
 97 
 98     // 非递归遍历
 99     NonRecursion(&nodeA); 
100 
101 } 
102 
103 
104 int main(){
105     printf("好好学习,天天向上~!\t\t 13 二叉树非递归遍历(链式栈)20220612\n\n");
106     
107     
108     
109     CresteBinaryTree();
110     
111     
112     
113     printf("\n\n");
114     system("pause");
115     return 0;
116 }

LinkStack.c

 1 #include "LinkStack.h"
 2 
 3 
 4 // 初始化
 5 LinkStack* Init_LinkStack(){
 6     
 7     // 开内存
 8      LinkStack* stack = (LinkStack*)malloc(sizeof(LinkStack));
 9      // 初始化
10      stack->HeadNode.next = NULL;
11      stack->size = 0;
12     
13     return stack;
14 }
15 
16 // 入栈
17 void Push_LinkStack(LinkStack* stack,LinkNode* data){
18     
19     if(stack == NULL){
20         return;
21     }
22     if(data == NULL){
23         return;
24     }
25     
26     data->next = stack->HeadNode.next;
27     stack->HeadNode.next = data;
28     
29     stack->size++;
30     
31 }
32 
33 // 出栈 (删除第一个元素) 
34 void Pop_LinkStack(LinkStack* stack){
35     
36     if(stack == NULL){
37         return ;
38     }
39     if(stack->size==0){
40         return ;
41     }    
42     
43     // 第一个有效节点
44     LinkNode* pNext =  stack->HeadNode.next;
45     stack->HeadNode.next = pNext->next;    // pNext.next为第一个有效节点的下一个节点 
46     
47     stack->size--;
48 
49 }
50 
51 // 返回栈顶元素
52 LinkNode* Top_LinkStack(LinkStack* stack){
53     
54     if(stack == NULL){
55         return NULL;
56     }
57     if(stack->size==0){
58         return NULL;
59     }            
60     
61     return stack->HeadNode.next;
62 }
63 
64 // 返回栈元素的个数
65 int Size_LinkStack(LinkStack* stack){
66     if(stack == NULL){
67         return -1;
68     }    
69     return stack->size;
70 }
71 
72 // 清空栈
73 void Clear_LinkStack(LinkStack* stack){
74     
75     if(stack == NULL){
76         return;
77     }
78     stack->HeadNode.next = NULL;
79     stack->size=0;    
80     
81 }
82 
83 // 销毁栈
84 void FreeSpace_LinkStack(LinkStack* stack){
85     
86     if(stack == NULL){
87         return;
88     }
89     
90     free(stack);
91     
92     
93 }

LinkStack.h

 1 #ifndef LINKSTACK_H
 2 #define LINKSTACK_H
 3 
 4 #include <stdio.h>
 5 #include <stdlib.h>
 6 
 7 
 8 // 链式栈的节点 
 9 typedef struct LINKNODE{
10     struct LINKNODE* next; 
11 }LinkNode;
12 
13 // 链式栈 
14  
15 typedef struct LINKSTACK{
16     LinkNode HeadNode;    //头节点
17     int size;
18 }LinkStack; 
19 
20 // 初始化
21 LinkStack* Init_LinkStack();
22 // 入栈
23 void Push_LinkStack(LinkStack* stack,LinkNode* data);
24 // 出栈 (删除第一个元素) 
25 void Pop_LinkStack(LinkStack* stack); 
26 // 返回栈顶元素
27 LinkNode* Top_LinkStack(LinkStack* stack); 
28 // 返回栈元素的个数
29 int Size_LinkStack(LinkStack* stack); 
30 // 清空栈
31 void Clear_LinkStack(LinkStack* stack);
32 // 销毁栈
33 void FreeSpace_LinkStack(LinkStack* stack); 
34 
35 
36 
37 #endif

 

标签:LinkStack,13,return,20220612,二叉树,NULL,LinkNode,stack,BinaryNode
来源: https://www.cnblogs.com/stou/p/16368293.html