二叉树的建立、四种遍历、求深度、求叶子结点数

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 typedef struct Node{
  4     struct Node *lchild, *rchild;
  5     char data;
  6 }BiNode, *BiTree;
  7 BiTree CreatBiTree(BiTree *T)//前序建树,输入的是扩展二叉树
  8 {
  9     char a;
 10     scanf("%c", &a);
 11     if(a == ‘#‘) *T = NULL;
 12     else{
 13         *T = (BiNode *)malloc(sizeof(BiNode));
 14         (*T)->data = a;
 15         CreatBiTree(&(*T)->lchild);
 16         CreatBiTree(&(*T)->rchild);
 17     }
 18     return *T;
 19 }
 20 void PreOrder(BiTree T)
 21 {
 22     if(T){
 23         printf("%c ", T->data);
 24         PreOrder(T->lchild);
 25         PreOrder(T->rchild);
 26     }
 27 }
 28 void InOrder(BiTree T)
 29 {
 30     if(T){
 31         InOrder(T->lchild);
 32         printf("%c ", T->data);
 33         InOrder(T->rchild);
 34     }
 35 }
 36 void PostOrder(BiTree T)
 37 {
 38     if(T){
 39         PostOrder(T->lchild);
 40         PostOrder(T->rchild);
 41         printf("%c ", T->data);
 42     }
 43 }
 44 void LevelOrder(BiTree T)//注意这里开的队列一定要是结构体型,因为要寻左右孩子
 45 {
 46     BiNode *q[100];
 47     int front=0, rear=0;
 48     q[rear++] = T;
 49     while(front != rear){
 50         BiNode *t = q[front++];
 51         printf("%c ", t->data);
 52         if(t->lchild) q[rear++] = t->lchild;
 53         if(t->rchild) q[rear++] = t->rchild;
 54     }
 55 }
 56 int cal_depth(BiTree T)//求深度,思想是求出左右深度,再用大的加一
 57 {
 58     if(!T) return 0;
 59     else{
 60         int h1 = cal_depth(T->lchild);
 61         int h2 = cal_depth(T->rchild);
 62         return h1>h2? h1+1:h2+1;//所以是先等两个调用出结果,再计算本层的深度
 63     }
 64 }
 65 int cal_leaves1(BiTree T, int *num)//第二个形参好像必须要有
 66 {
 67     if(!T->lchild&&!T->rchild) (*num)++;
 68     else{
 69         if(T->lchild) cal_leaves1(T->lchild, num);
 70         if(T->rchild) cal_leaves1(T->rchild, num);
 71     }
 72     return *num;//返回值要么不变要吗+1。返回值可以省略成void
 73 }
 74 int cal_leaves2(BiTree T)//*没想到 *
 75 {
 76     if(!T) return 0;
 77     else if(!T->lchild&&!T->rchild) return 1;
 78     else {
 79         return cal_leaves2(T->lchild)+cal_leaves2(T->rchild);
 80     }
 81 }
 82 int main()
 83 {
 84     BiTree T;
 85     T = CreatBiTree(&T);
 86     PreOrder(T);
 87     printf("---前序遍历\n");
 88     InOrder(T);
 89     printf("---中序遍历\n");
 90     PostOrder(T);
 91     printf("---后序遍历\n");
 92     LevelOrder(T);
 93     printf("---层次遍历\n");
 94
 95     printf("二叉树深度:%d\n", cal_depth(T));
 96     int n = 0;
 97     printf("叶子结点数(算法1):%d\n", cal_leaves1(T, &n));
 98     printf("叶子结点数(算法2):%d\n", cal_leaves2(T));
 99     return 0;
100 } 

测试数据1:abc##de#f##g###

原文地址:https://www.cnblogs.com/Surprisezang/p/10197987.html

时间: 2024-10-02 18:26:06

二叉树的建立、四种遍历、求深度、求叶子结点数的相关文章

C++算法之 求二叉树的节点个数、深度、四种遍历方法

//节点的数据结构 class BTree { public: int m_nValue; BTree* m_nLeft; BTree* m_nRight; public: BTree(int value) { m_nValue = value; } }; 一:求二叉树的节点个数: /* 求二叉数中的节点个数 递归解法: 1:如果二叉树为空,节点的个数为0 2:如果二叉树不为空,二叉树节点的个数 = 左子树节点个数+右子树节点的个数+1: */ int GetNodeCount(BTree* p

二叉树的创建和四种遍历(前序、先序、后序、层次、结点的层数、深度、叶子数等)—java描述

二叉树的创建和四种遍历(前序.先序.后序.层次.结点的层数.深度.叶子数等)—java描述 package javab; //树的结点类 public class TreeNode { String data; TreeNode leftChild,rightChild,next; public TreeNode(String data){ this.data=data; } public TreeNode(String data,TreeNode left,TreeNode right){ l

二叉树的四种遍历方式

二叉树的四种遍历方式: 二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有的结点,使得每个结点被访问依次且仅被访问一次.四种遍历方式分别为:先序遍历.中序遍历.后序遍历.层序遍历. 遍历之前,我们首先介绍一下,如何创建一个二叉树,在这里博主宝宝用的是先建左树在建右树的方法, 首先要声明结点TreeNode类,代码如下: public class TreeNode { public int data; public TreeNode le

数组的创建/查找数组里面的内容/添加数组中元素/使用指定的字符串把数组链接起来/判断数组内是否有指定的数组元素/四种遍历进行输出数组中的元素有哪些

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //创建数组 //1.快速创建数组@[] NSArray*[email protected][@"month",@"tue",@" wed",@"fir"]; //2,创建空的数组 NSArray*arr=[[NSArray a

java集合四种遍历方式

package conection; import java.util.Iterator;import java.util.LinkedList;import java.util.List; public class Ergodic { public static void main(String[] args) {     // TODO Auto-generated method stub    /*    * java集合类的四种遍历方式    *     */    List<Integ

lua中for循环的四种遍历方式

lua中for的四种遍历方式区别 table.maxn 取最大的整数key #table 从1开始的顺序整数最大值,如1,2,3,6 #table == 3 key,value pairs 取每一个键值对 ipairs 取从key==1开始的顺序整数最大值,每个键值对 参考http://rangercyh.blog.51cto.com/1444712/1032925 不过有一个问题, tbtest = { [1] = 1, [2] = 2, [4] = 4, } print(#(tbtest))

四种遍历结构

在这里写出四种遍历:前.中.后和层次遍历的代码: void InorderTraversal( BinTree BT ) { if( BT ) { InorderTraversal( BT->Left ); /* 此处假设对BT结点的访问就是打印数据 */ printf("%d ", BT->Data); /* 假设数据为整型 */ InorderTraversal( BT->Right ); } } void PreorderTraversal( BinTree B

svn代表四种检出深度

代表四种检出深度: 1.Fully recursive--全递归:检出完整的目录树,包含所有的文件或子目录. 2.Immediate children,including folders--直接子节点,包含文件夹:检出目录,包含其中的文件或子目录,但是不递归展开子目录. 3.Only file chlidren--仅文件子节点:检出指定目录,包含所有文件,但是不检出任何子目录.4.Only this item--仅此项:只检出目录.不包含其中的文件或子目录.

list的四种遍历方式

1.手先增强for循环和iterator遍历的效果是一样的,也就说 增强for循环的内部也就是调用iteratoer实现的,但是增强for循环 有些缺点,例如不能在增强循环里动态的删除集合内容.不能获取下标等. 2.ArrayList由于使用数组实现,因此下标明确,最好使用普通循环. 3.而对于 LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用 增强for循环,也就是iterator. list,map,set的区别  list,map,set的区别 (首先假定小猪都是同一

HashMap的四种遍历方法,及效率比较(简单明了)

https://yq.aliyun.com/ziliao/210955 public static void main(String[] args) { HashMap<Integer, String> map = new HashMap<Integer, String>(); for (int i = 0; i < 40000; i++) { map.put(i, "第" + i + "个"); } //循环第一种 long t1 =