二叉树基本操作C代码

  1 #include<stdio.h>
  2 #include<malloc.h>
  3 #define LEN sizeof(struct ChainTree)
  4 struct ChainTree
  5 {
  6     int num;
  7     struct ChainTree *left;
  8     struct ChainTree *right;
  9 };
 10 /*函数功能:进行查找操作。*/
 11 ChainTree *BinTreeFind(ChainTree *bt,int data)//在二叉树中查找值为data的结点。
 12 {
 13     ChainTree *p;
 14     if(bt==NULL)
 15         return NULL;
 16     else
 17     {
 18         if(bt->num==data)
 19         return bt;
 20         else{
 21             if(p=BinTreeFind(bt->left,data))
 22                 return p;
 23              else if(p=BinTreeFind(bt->right,data))
 24                  return p;
 25              else
 26                  return NULL;
 27           }
 28     }
 29 }
 30 /*函数功能:先序遍历。*/
 31 void BinTree_DLR(ChainTree *bt)
 32 {
 33     if(bt)
 34     {
 35         printf("%d",bt->num);
 36         if(bt->left)
 37         {
 38             BinTree_DLR(bt->left);
 39         }
 40         if(bt->right)
 41         {
 42             BinTree_DLR(bt->right);
 43         }
 44     }
 45     return;
 46 }
 47 /*函数定义:后序遍历。*/
 48 void BinTree_LRD(ChainTree *bt)
 49 {
 50     if(bt)
 51     {
 52         BinTree_LRD(bt->left);
 53         BinTree_LRD(bt->right);
 54         printf("%d",bt->num);
 55     }
 56     return;
 57 }
 58 /*函数功能:中序遍历。*/
 59 void BinTree_LDR(ChainTree *bt)
 60 {
 61     if(bt)
 62     {
 63         BinTree_LDR(bt->left);
 64         printf("%d",bt->num);
 65         BinTree_LDR(bt->right);
 66     }
 67     return;
 68 }
 69 /*函数功能初始化一个二叉树,建立根节点。*/
 70 ChainTree *InitRoot()
 71 {
 72     ChainTree *node;
 73     node=(struct ChainTree*)malloc(LEN);
 74     printf("请输入根节点的值:");
 75     scanf("%d",&node->num);
 76     node->left=NULL;
 77     node->right=NULL;
 78     return node;
 79 }
 80
 81 /*添加数据到二叉树*/
 82 int BinTreeAddNode(ChainTree *bt,ChainTree *node,int n)
 83 {
 84     if(bt==NULL)
 85     {
 86         printf("\n父结点不在,请先设置父结点。");
 87         return 0;
 88     }
 89     switch(n)
 90     {
 91         case 1:
 92             if(bt->left)
 93             {
 94                 printf("左子树结点不为空。");
 95                 return 0;
 96             }
 97             else
 98                 bt->left=node;
 99             break;
100         case 2:
101             if(bt->right)
102             {
103                 printf("右子树结点不为空。");
104                 return 0;
105             }
106             else
107                 bt->right=node;
108             break;
109             default:
110                 printf("参数错误!\n");
111             return 0;
112     }
113     return 1;
114 }
115
116 /*函数功能:添加结点到二叉树。*/
117 void AddNode(ChainTree *bt)
118 {
119     int data;
120     int select;
121     ChainTree *node,*parent;
122     node=(struct ChainTree*)malloc(LEN);
123     printf("\n输入二叉树结点数据");
124     scanf("%d",&node->num);
125     node->left=NULL;
126     node->right=NULL;
127     printf("\n输入父结点数据:");
128     scanf("%d",&data);
129     parent=BinTreeFind(bt,data);
130     if(!parent)
131     {
132         printf("\n未找到父结点。");
133     }
134     printf("\n1.添加到左子树\n2.添加到右子树\n");
135     do{
136         scanf("%d",&select);
137         if(select==1||select==2)
138         BinTreeAddNode(parent,node,select);
139         }while(select!=1&&select!=2);
140 }
141
142 /*求二叉树叶子结点个数*/
143 void CountLeaf(ChainTree *bt,int &count)
144 {
145     if(bt)
146     {
147         if((!bt->left)&&(!bt->right))
148             count++;
149         CountLeaf(bt->left,count);
150         CountLeaf(bt->right,count);
151     }
152 }
153
154 /*求二叉树深度*/
155 int BinTreeDepth(ChainTree *bt)
156 {
157     int dep1,dep2;
158     if(bt==NULL)
159     return 0;
160     else
161     {
162         dep1=BinTreeDepth(bt->left);                //左子树深度(递归调用)
163         dep2=BinTreeDepth(bt->right);              //右子树深度(递归调用)
164         if(dep1>dep2)
165             return dep1+1;
166         else
167             return dep2+1;
168     }
169 }
170
171 int main()
172 {
173     struct ChainTree *p1,*p2,*head,*p3;
174     int select = 1000;
175     int countleaf=0;                                        //该变量计算叶子结点个数
176     while(select!=0){
177         printf("\n1.设置二叉树根元素\n2.添加二叉树根节点\n3.先序遍历\n4.中序遍历\n5.后序遍历\n6.输出叶子结点个数\n7.求二叉树深度\n0.退出");
178         scanf("%d",&select);
179         switch(select)
180         {
181         case 1:
182             head=InitRoot();
183             break;
184         case 2:
185             AddNode(head);
186             break;
187         case 3:
188             BinTree_DLR(head);
189             break;
190         case 4:
191              BinTree_LDR(head);
192              break;
193         case 5:
194             BinTree_LRD(head);
195             break;
196         case 6:
197                countleaf=0;                                              //求二叉树叶子结点数
198             CountLeaf(head,countleaf);
199             printf("\n%d",countleaf);
200             break;
201         case 7:
202             printf("二叉树深度为:%d\n",BinTreeDepth(head));
203              break;
204         case 0:
205             select = 0;
206             break;
207         }
208     }
209 }  
时间: 2024-10-07 20:22:45

二叉树基本操作C代码的相关文章

二叉树基本操作:前序、中序、后序遍历(递归方式)

二叉树是最常见最重要的数据结构之一,它的定义如下: 二叉树(binary tree)是有限多个节点的集合,这个结合或者是空集,或者由一个根节点和两颗互不相交的.分别称为左子树和右子树的二叉树组成. 二叉树最基本的操作是遍历:一般约定遍历时左节点优先于右节点,这样根据根节点的遍历顺序可分为三种遍历操作:前序-先遍历根节点,再处理左右节点:中序-先遍历左节点,然后处理根节点,最后处理右节点:后序-先遍历左右节点,然后处理根节点. 从上边二叉树定义可以看出:二叉树使用了递归的概念描述.所以,二叉树的很

二叉树基本操作续一:二叉树建立、节点数统计

在上一篇:二叉树基本操作 中,我们描述了二叉树的递归遍历函数.在这里主要是给出这些函数的测试代码,为了测试更加方便,我们实现了三个新的函数:建立二叉树.统计二叉树叶子节点数量.统计二叉树总节点数量.(二叉树的定义用上篇文章中的定义) 二叉树建立: 1 tree_pointer create_bin_tree() 2 { 3 tree_pointer node; 4 int x; 5 scanf("%d", &x); 6 if (x == 0) { 7 node = NULL;

二叉树基本操作续二:前序、中序、后序遍历(非递归 迭代方式)

这里给出二叉树三种遍历方式的迭代实现代码.二叉树的递归实现使用系统栈入栈出栈,而非递归的迭代实现方法就是手动维护一个栈,来模拟递归的入栈出栈过程. 本文没有给出用户栈的代码,如果需要结合上篇的测试代码一起测试,则需要自己实现自己的栈,以及基本的pop.push等栈操作函数. 前序迭代遍历: 1 void iter_preorder(tree_pointer ptr) 2 { 3 //前序遍历:先遍历根节点,然后再分别遍历左右子树 4 int top = -1; 5 tree_pointer st

编程算法 - 二叉树的深度 代码(C)

二叉树的深度 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一棵二叉树的根节点, 求该树的深度. 依次选择最深的左右子树, 然后递归加1. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #include <stdlib.h> #include <

编程算法 - 判断二叉树是不是平衡树 代码(C)

判断二叉树是不平衡树 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一颗二叉树的根结点, 判断该树是不是平衡二叉树. 二叉平衡树: 任意结点的左右子树的深度相差不超过1. 使用后序遍历的方式, 并且保存左右子树的深度, 进行比较. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <std

数据机构实验报告-实验三 二叉树基本操作的实现

实验三   二叉树基本操作的实现   l  实验目的 1.二叉树的基本操作 (1)掌握二叉树链表的结构和二叉排序树的建立过程. (2)掌握二叉树排序树的插入和删除操作. (3)加深对二叉树的理解,逐步培养解决实际问题的编程能力. 2.树的遍历和哈夫曼树 (1)掌握用递归方法实现二叉树遍历的操作. (2)掌握用非递归方法实现二叉树遍历的操作. (3)掌握建立Huffman树的操作. (4)加深对二叉树的理解,逐步培养解决实际问题的编程能力. l  实验内容 1.二叉树的基本操作 (一)基础题 (1

二叉树基本操作——收录

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 }

数据结构 【实验7 二叉树基本操作】

实验7   二叉树基本操作 实验目的 1.  熟悉二叉树结点的结构和对二叉树的基本操作. 2.  掌握对二叉树每一种操作的具体实现. 3.  学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法. 实验内容 该程序的功能是实现二叉树结点的类型定义和对二叉树的基本操作.该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数. /* 定义DataType为char类型 */ typedef char DataType; /* 二叉树的结点类型 */ typedef struct Bit

二叉树基本操作-C语言实现

二叉树基本操作 #include <iostream> #include <stdlib.h> using namespace std; typedef struct node { char sh; struct node *lchild, *rchild; }TreeNode, *pTreeNode; //这里注意,必须要使用&,不然后面求二叉树深度时有误 void Creat_Tree(pTreeNode & T) { char ch; cin >>