二叉树基本操作——收录
1 #include 2 #include 3 #include 4 typedefchar ElemType; //定义树的结点类型 5 typedefstruct BiTNode 6 { 7 ElemType data; 8 struct BiTNode *lchild; 9 struct BiTNode *rchild; 10 }BiTNode,*BiTree; 11 //创建空二叉树 12 void InitBiTree(BiTree &T) 13 { 14 T = NULL; 15 } 16 //二叉树的创建 17 void CreateBiTree(BiTree &T) 18 { 19 char ch; 20 scanf("%c",&ch); 21 if(ch == ' ') 22 { 23 T=NULL; //截止二叉树的建立 24 } 25 else 26 { 27 T = (BiTNode *) malloc(sizeof(BiTNode)); //申请结点空间 28 if(!T) 29 exit(0); 30 T-<data = ch; 31 CreateBiTree(T-<lchild); //构造左子树 32 CreateBiTree(T-<rchild); //构造右子树 33 } 34 } 35 //////////////////////////////////////////// 36 //二叉树的先序遍历 37 void PreOrderTraverse(BiTNode *p) 38 { 39 if(p != NULL) 40 { 41 printf("%c*",p-<data); 42 PreOrderTraverse(p-<lchild); 43 PreOrderTraverse(p-<rchild); 44 } 45 } 46 //二叉树的中序遍历 47 void InOrderTraverse(BiTNode *p) 48 { 49 if(p != NULL) 50 { 51 InOrderTraverse(p-<lchild); 52 printf("%c*",p-<data); 53 InOrderTraverse(p-<rchild); 54 } 55 } 56 //二叉树的后序遍历 57 void PostOrderTraverse(BiTNode *p) 58 { 59 if(p != NULL) 60 { 61 PostOrderTraverse(p-<lchild); 62 PostOrderTraverse(p-<rchild); 63 printf("%c*",p-<data); 64 } 65 } 66 //求二叉树的高度 67 int High(BiTNode *p) 68 { 69 int lh=0; 70 int rh=0; 71 if(p == NULL) 72 { 73 return 0; 74 } 75 lh=High(p-<lchild); 76 rh=High(p-<rchild); 77 if(lh<rh) 78 { 79 return lh+1; 80 } 81 else 82 { 83 return rh+1; 84 } 85 } 86 //求二叉树的结点数目 87 int Count(BiTree T) 88 { 89 if(T == NULL) 90 { 91 return 0; 92 } 93 return Count(T-<lchild)+Count(T-<rchild)+1; 94 } 95 //实现左右子树的交换 96 void exchange(BiTree T) 97 { 98 if(T == NULL) 99 { 100 return; 101 } 102 else 103 { 104 BiTree temp=T-<lchild; 105 T-<lchild = T-<rchild; 106 T-<rchild = temp; 107 exchange(T-<lchild); 108 exchange(T-<rchild); 109 } 110 } 111 //前序遍历的非递归算法 112 void PreTraverse(BiTree T) 113 { 114 BiTree p; 115 p=T; 116 stack S; 117 S.IintStack(); 118 while(p || S.StackEmpty()) 119 { 120 if(p) 121 { 122 printf("%d",p-<data); 123 Push(&S,p); 124 p=p-<lchild; 125 } 126 else 127 { 128 S.pop(p); 129 p=p-<rchild; 130 } 131 } 132 } 133 //中序遍历的非递归算法 134 void InTraverse(BiTree T) 135 { 136 BiTree p; 137 p=T; 138 stack S; 139 S.IintStack(); 140 while(p || S.StackEmpty()) 141 { 142 if(p) 143 { 144 Push(&S,p); 145 p=p-<lchild; 146 } 147 else 148 { 149 S.pop(p); 150 printf("%d",p-<data); 151 p=p-<rchild; 152 } 153 } 154 } 155 //后序遍历的非递归算法 156 #define MaxSize 100 157 void PostTraverse(BiTree T) 158 { 159 BiTree p; 160 stack S; 161 int intstack[MaxSize]; 162 int i; 163 int top; 164 p=T; 165 //S.IintStack(); 166 for(int i=0;i<100 ispan> 167 { 168 intstack[i]=0; 169 } 170 top=0; 171 while(p || S.empty()) 172 { 173 if(p) 174 { 175 Push(&S,p); 176 intstack[top]=0; 177 top++; 178 p=p-<lchild; 179 } 180 else 181 { 182 if(intstack[top-1] == 0) 183 { 184 GetTop(S,&p); 185 intstack[top-1]=1; 186 p=p-<rchild; 187 } 188 else 189 { 190 Pop(&S,&p); 191 top--; 192 printf("%d",p-<data); 193 p=NULL; 194 } 195 } 196 } 197 } 198 int main() 199 { 200 BiTree T; 201 CreateBiTree(T); 202 PreOrderTraverse(T); 203 printf("\n"); 204 InOrderTraverse(T); 205 printf("\n"); 206 PostOrderTraverse(T); 207 printf("\n"); 208 int a=High(T); 209 int b=Count(T); 210 exchange(T); 211 return 0; 212 }