二叉树实现

先序遍历:根---->左----->右       //根在前     先左后右
中序遍历:左---->根----->右       //根在中     先左后右
后序遍历:左---->右----->根       //根在后     先左后右
先序遍历: B E K F C G D  
中序遍历: K E F B C G D
后序遍历:K F E G C D B
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #include <ctype.h>
  5 typedef struct BinaryNode
  6 {
  7      char str;
  8      struct BinaryNode * leftnode;
  9      struct BinaryNode * rightnode;
 10 }binanode;
 11 int num = 0;
 12 int height = 0;
 13 int height_ls = 0;
 14 //拷贝二叉树
 15 binanode * CopyNode(binanode * root)
 16 {
 17         if (root == NULL)
 18         {
 19                return;
 20         }
 21         binanode *lchild = CopyNode(root->leftnode);    //拷贝左子树
 22         binanode *rchild = CopyNode(root->rightnode);   //拷贝右子树
 23         //创建节点
 24         binanode *newnode = (binanode*)malloc(sizeof(binanode));
 25         newnode->str = root->str;
 26         newnode->leftnode = root->leftnode;
 27         newnode->rightnode = root->rightnode;
 28 }
 29 //求叶子节点数
 30 void LeafNum(binanode *root)
 31 {
 32         if (root == NULL)
 33         {
 34                return;
 35         }
 36         if (root->leftnode == NULL && root->rightnode == NULL)
 37         {
 38                num++;
 39         }
 40         LeafNum(root->leftnode);
 41         LeafNum(root->rightnode);
 42 }
 43 //求二叉树的高
 44 void HeightNum(binanode *root)
 45 {
 46         if (root == NULL)
 47         {
 48                return;
 49         }
 50         if (root->leftnode != NULL || root->rightnode != NULL)
 51         {
 52                height_ls++;
 53                if (height_ls > height)
 54                {
 55                        height = height_ls;
 56                }
 57         }
 58         else
 59         {
 60                height_ls = 1;
 61         }
 62         HeightNum(root->leftnode);
 63         HeightNum(root->rightnode);
 64 }
 65 //递归法先序遍历------>根   左   右
 66 void Recursion(binanode *root)
 67 {
 68         if (root == NULL)
 69         {
 70                return;
 71         }
 72         //打印根节点
 73         printf("  %c ", root->str);
 74         //遍历左节点
 75         Recursion(root->leftnode);
 76         //遍历右节点
 77         Recursion(root->rightnode);
 78 }
 79 //递归法中序遍历------>左   根   右
 80 void Recursionzhong(binanode *root)
 81 {
 82         if (root == NULL)
 83         {
 84                return;
 85         }
 86         //遍历左节点
 87         Recursion(root->leftnode);
 88         //遍历根节点
 89         printf("  %c  ", root->str);
 90         //遍历右节点
 91         Recursion(root->rightnode);
 92 }
 93 //递归法后序遍历------>左   右   根
 94 void Recursionhou(binanode *root)
 95 {
 96         if (root == NULL)
 97         {
 98                return;
 99         }
100         //打印左节点节点
101         Recursion(root->leftnode);
102         //遍历右节点
103         Recursion(root->rightnode);
104         //遍历根节点
105         printf("  %c ", root->str);
106         
107 }
108 //创建二叉树
109 void CreaterBinaryTree()
110 {
111         //建立二叉树所需要的节点
112         binanode node1 = { 'A', NULL, NULL };
113         binanode node2 = { 'B', NULL, NULL };
114         binanode node3 = { 'C', NULL, NULL };
115         binanode node4 = { 'D', NULL, NULL };
116         binanode node5 = { 'E', NULL, NULL };
117         binanode node6 = { 'F', NULL, NULL };
118         binanode node7 = { 'G', NULL, NULL };
119         binanode node8 = { 'H', NULL, NULL };
120         binanode node9 = { 'I', NULL, NULL };
121         binanode node10= { 'J', NULL, NULL };
122         //按关系连接各自的节点,形成二叉树
123         node1.leftnode = &node2;
124         node1.rightnode = &node6;
125         node2.rightnode = &node3;
126         node3.leftnode = &node4;
127         node3.rightnode = &node5;
128         node6.rightnode = &node7;
129         node7.leftnode = &node8;
130         node8.leftnode = &node9;
131         node9.leftnode = &node10;
132         Recursion(&node1);      //传入根节点,实行先序遍历
133         printf("\n");
134         Recursionzhong(&node1);      //传入根节点,实行中序遍历
135         printf("\n");
136         Recursionhou(&node1);      //传入根节点,实行后序遍历
137         printf("\n");
138         LeafNum(&node1);           //求叶子个数
139         printf("叶子数目为:%d \n", num);
140         HeightNum(&node1);            //求叶子的高
141         printf("树高为:%d \n", height);
142         //拷贝二叉树
143         binanode *newnode = CopyNode(&node1);
144         Recursion(newnode);    //遍历拷贝的二叉树
145 }
146 int main(void)
147 {
148         CreaterBinaryTree();
149         system("pause");
150         return 0;
151 }

 

posted @ 2021-02-05 15:46  Sjianzhao  阅读(34)  评论(0)    收藏  举报