数据结构二叉树构造及遍历详解

前言

最近学到了二叉树,就学着将二叉树构造,并尝试三种遍历操作。本次主要使用递归,回头会整理非递归的方法。

定义二叉树

1 typedef struct BinaryTree
2 {
3     TelemType data;
4     struct BinaryTree *lchild;
5     struct BinaryTree *rchild;
6 }*Node,node;

其中要注意Node是结构体指针,这样定义以后使用会方便很多。

构造二叉树

 1 Node CreatTree()
 2 {
 3     Node p;
 4     TelemType a;
 5     cin >> a;
 6     if(a == 0)
 7         p = NULL;
 8     else
 9     {
10         p = (Node)malloc(sizeof(node));
11         p->data = a;
12         p->lchild = CreatTree();
13         p->rchild = CreatTree();
14     }
15     return p;
16 }

注意:创建二叉树的顺序为先根节点,然后是左子树,最后是右子树,另外叶子结点要分别赋0。

如:                 1

2                   3                需要输入1  2  0  0  3  0  0

二叉树节点数

1 int NodeNumber(Node root)
2 {
3     if(root == NULL)
4         return 0;
5     else
6         return 1+NodeNumber(root->lchild) + NodeNumber(root->rchild);
7 }

二叉树深度

1 int DepthTree(Node root)
2 {
3     if(root)
4         return DepthTree(root->lchild) > DepthTree(root->rchild) ? DepthTree(root->lchild) + 1 : DepthTree(root->rchild) + 1;
5     else
6         return 0;
7 }

二叉树叶子结点数

 1 int LeafNumber(Node root)
 2 {
 3     if(!root)
 4         return 0;
 5     else if( (root->lchild == NULL) && (root->rchild == NULL) )
 6         return 1;
 7     else
 8         return ( LeafNumber(root->lchild) + LeafNumber(root->rchild) );
 9 }

先序遍历

1 void PreorderTraverse(Node root)
2 {
3     if(root)
4     {
5         cout << root->data<<‘ ‘;
6         PreorderTraverse(root->lchild);
7         PreorderTraverse(root->rchild);
8     }
9 }

中序遍历

1 void InorderTraverse(Node root)
2 {
3     if(root)
4     {
5         InorderTraverse(root->lchild);
6         cout<<root->data<<‘ ‘;
7         InorderTraverse(root->rchild);
8     }
9 }

后序遍历

1 void LastorderTraverse(Node root)
2 {
3     if(root)
4     {
5         LastorderTraverse(root->lchild);
6         LastorderTraverse(root->rchild);
7         cout<<root->data<<‘ ‘;
8     }
9 }

完整代码

  1 #include<cstring>
  2 #include<cstdlib>
  3 #include <iostream>
  4 using namespace std;
  5 typedef int TelemType;
  6 typedef struct BinaryTree
  7 {
  8     TelemType data;
  9     struct BinaryTree *lchild;
 10     struct BinaryTree *rchild;
 11 }*Node,node;
 12
 13 Node CreatTree()
 14 {
 15     Node p;
 16     TelemType a;
 17     cin >> a;
 18     if(a == 0)
 19         p = NULL;
 20     else
 21     {
 22         p = (Node)malloc(sizeof(node));
 23         p->data = a;
 24         p->lchild = CreatTree();
 25         p->rchild = CreatTree();
 26     }
 27     return p;
 28 }
 29
 30 void PreorderTraverse(Node root)
 31 {
 32     if(root)
 33     {
 34         cout << root->data<<‘ ‘;
 35         PreorderTraverse(root->lchild);
 36         PreorderTraverse(root->rchild);
 37     }
 38 }
 39
 40 void InorderTraverse(Node root)
 41 {
 42     if(root)
 43     {
 44         InorderTraverse(root->lchild);
 45         cout<<root->data<<‘ ‘;
 46         InorderTraverse(root->rchild);
 47     }
 48 }
 49
 50 void LastorderTraverse(Node root)
 51 {
 52     if(root)
 53     {
 54         LastorderTraverse(root->lchild);
 55         LastorderTraverse(root->rchild);
 56         cout<<root->data<<‘ ‘;
 57     }
 58 }
 59
 60 int NodeNumber(Node root)
 61 {
 62     if(root == NULL)
 63         return 0;
 64     else
 65         return 1+NodeNumber(root->lchild) + NodeNumber(root->rchild);
 66 }
 67
 68 int DepthTree(Node root)
 69 {
 70     if(root)
 71         return DepthTree(root->lchild) > DepthTree(root->rchild) ? DepthTree(root->lchild) + 1 : DepthTree(root->rchild) + 1;
 72     else
 73         return 0;
 74 }
 75
 76 int LeafNumber(Node root)
 77 {
 78     if(!root)
 79         return 0;
 80     else if( (root->lchild == NULL) && (root->rchild == NULL) )
 81         return 1;
 82     else
 83         return ( LeafNumber(root->lchild) + LeafNumber(root->rchild) );
 84 }
 85
 86
 87
 88 int main()
 89 {
 90     Node root=NULL;
 91     cout<<"请输入数据:"<<endl;
 92     root=CreatTree();
 93     cout<<"二叉树建立成功!"<<endl;
 94
 95     cout<<"二叉树节点数为:"<<NodeNumber(root)<<endl;
 96
 97     cout<<"二叉树深度为:"<<DepthTree(root)<<endl;
 98
 99     cout<<"二叉树叶子结点数为:"<<LeafNumber(root)<<endl;
100
101     cout<<"前序遍历:"<<endl;
102     PreorderTraverse(root);
103     cout<<endl;
104
105     cout<<"中序遍历:"<<endl;
106     InorderTraverse(root);
107     cout<<endl;
108
109     cout<<"后序遍历:"<<endl;
110     LastorderTraverse(root);
111     cout<<endl;
112
113     return 0;
114 }

?

  首发在CSDN,有兴趣可以访问https://blog.csdn.net/qq_41785863

原文地址:https://www.cnblogs.com/aerer/p/9919411.html

时间: 2024-11-05 17:28:15

数据结构二叉树构造及遍历详解的相关文章

二叉树构造、遍历和释放--自己写数据结构

直接上代码 bitree.h文件如下: #ifndef _BITREE_H_ #define _BITREE_H_ typedef char TElemType; typedef struct _BitNode { TElemType data; struct _BitNode *lchild,*rchild; }BitNode,*pBitNode; int bittree_creat(BitNode **T); void pre_order(BitNode *T); void mid_orde

OpenCV学习C++接口 Mat像素遍历详解

OpenCV学习C++接口 Mat像素遍历详解 原文地址:https://www.cnblogs.com/zhehan54/p/8460602.html

3、二叉树:先序,中序,后序循环遍历详解

原创博客,转载请注明出处,谢谢~~~ 设计二叉树的循环遍历算法对于深刻理解二叉树很有帮助.下面就详细分析3个循环遍历算法. 1.先序循环遍历算法. 在自己设计循环遍历算法的时候,感觉先序遍历算法设计最为容易.下面把设计思路写下来,以防遗忘. 先序循环遍历二叉树的思路最为直接,规则就是: ①. 从根结点开始沿着左孩子一直走到头,在此过程中,每到达一个结点便访问其元素值(如,输出),同时检测该结点是否有右孩子,如果有则将指向右孩子的引用入栈: ②. 第一步完成以后,弹出一个栈顶引用作为本次循环的根节

[数据结构]二叉树创建与遍历

实验报告:二叉树创建与遍历 一.问题描述 二叉树是一种实用范围很广的非线性结构,一棵非空二叉树有也只有一个根结点,每个结点最多有两个子树,我们称为左子树与右子树,当一个结点的左.右子树都是空的时,沃恩称此结点为叶子结点. 二叉树有一些很好的性质,这里不再赘述.考虑如何存储一棵树,本实验选择使用链式存储结构——二叉链表:如果事先知道需要存储的二叉树是满二叉树或者完全二叉树,则可以考虑使用顺序存储,否则将浪费大量的存储空间. 对于一棵既成的二叉树,有三种遍历方式——先序.中序与后序.可以证明,一棵形

二叉树——前序遍历、中序遍历、后序遍历、层序遍历详解(递归非递归)

前言 前面介绍了二叉排序树的构造和基本方法的实现.但是排序遍历也是比较重要的一环.所以笔者将前中后序.和层序遍历梳理一遍. 了解树的遍历,需要具有的只是储备有队列,递归,和栈.这里笔者都有进行过详细介绍,可以关注笔者数据结构与算法专栏.持续分享,共同学习. 层序遍历 层序遍历.听名字也知道是按层遍历.我们知道一个节点有左右节点.而每一层一层的遍历都和左右节点有着很大的关系.也就是我们选用的数据结构不能一股脑的往一个方向钻,而左右应该均衡考虑.这样我们就选用队列来实现. 对于队列,现进先出.从根节

剑指Offer--&gt;从上向下打印二叉树(层序遍历 + 详解)

这道题目难度一般,重要的是想到以队列作为辅助来解决. 分析:因为按层打印的顺序决定了先打印的应该为根结点.为了接下来能够打印值为 8 的结点的两个子结点,应该在遍历到该结点时把值为 6 和 10 的两个结点保存到一个容器里,此时容器中含有 6 和 10 两个结点.按照从左到右的要求,先取出值为 6 的结点.打印出值 6 之后分别把 5 和 7 两个左右子结点放入容器 ,此时容器中的结点有三个,分别是10 . 5 和 7 .接下来我们从容器中取出值为 10 的结点,注意到 10 比另外两个元素先进

NYOJ-63 小猴子下落(二叉树及优化算法详解)

  小猴子下落 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 有一颗二叉树,最大深度为D,且所有叶子的深度都相同.所有结点从左到右从上到下的编号为1,2,3,·····,2的D次方减1.在结点1处放一个小猴子,它会往下跑.每个内结点上都有一个开关,初始全部关闭,当每次有小猴子跑到一个开关上时,它的状态都会改变,当到达一个内结点时,如果开关关闭,小猴子往左走,否则往右走,直到走到叶子结点. 一些小猴子从结点1处开始往下跑,最后一个小猴儿会跑到哪里呢? 输入 输入二叉

JSON数据构造及解析详解

1.JSON格式数据长啥样? 2.JSON简介 JSON(Javascript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,也易于机器解析和生成. 1)可读性:Json和XML相比可谓不相上下,一边是简单的语法,一边是规范的标签形式,很难分出胜负. 2)可扩展性:XML天生有很好的可扩展性,Json也有. 3)编码难度:XML有丰富的编码工具,Json也有提供,但是XML要输入很多结构字符. 4)解码难度:凡是可扩展的数据结构,解析起来都很困难. 5)数据量: J

数据结构 - 二叉树(重构 + 遍历)

写在前面 昨天有同学问到我一题关于重构二叉树的问题(link),做了一下,也做个记录吧! 所谓二叉树的重构,就是给你前序和中序,或者中序和后序,让你还原这棵二叉树. 注意:给出前序和后序是不能唯一确定一棵二叉树的,证明请看这儿. 一.给出前序和中序,重构二叉树 一个递归的过程: 当前结点的value:每一轮根据前序的第一个元素确定当前结点值. 左子树的中序遍历数组:以当前结点的value为分界点,将中序分为左部分和右部分,左部分即为左子树的中序遍历数组. 右子树的中序遍历数组:以当前结点的val