文章目录
- 前言
- 一、二叉树的先序创建
- 二、二叉树的复制
- 三、二叉树的深度
- 四、二叉树的结点个数
- 总结
前言
T_T此专栏用于记录数据结构及算法的(痛苦)学习历程,便于日后复习(这种事情不要啊)。所用教材为《数据结构 C语言版 第2版》严蔚敏。
一、二叉树的先序创建
相关概念见专栏数据结构与算法,下面给出二叉树先序创建的代码实现:
#include<iostream>
using namespace std;
//二叉树的二叉链表存储表示
typedef struct BTNode
{
char data; //结点数据域
struct BTNode* lchild, * rchild; //左右孩子指针
}BTNode, * BiTree;
//按先序次序创建二叉树,创建二叉链表表示的二叉树T
void PreCreateBiTree(BiTree& T)
{
char ch;
cin >> ch;
if (ch == '#') T = NULL; //递归结束,建空树
else {
T = new BTNode;
T->data = ch; //生成根结点
PreCreateBiTree(T->lchild); //递归创建左子树
PreCreateBiTree(T->rchild); //递归创建右子树
}
}
//中序遍历二叉树
void InOrderTraverse(BiTree T)
{
if (T) {
InOrderTraverse(T->lchild);
cout << T->data;
InOrderTraverse(T->rchild);
}
}
void main()
{
BiTree tree;
cout << "请输入先序建立二叉链表的序列:\n";
PreCreateBiTree(tree);
cout << "所建立的二叉链表中序序列:\n";
InOrderTraverse(tree);
cout << endl;
}
二、二叉树的复制
复制二叉树就是利用已有的一棵二叉树复制得到另外一棵与其完全相同的二叉树。下面给出二叉树的复制的代码实现:
#include<iostream>
using namespace std;
//二叉树的二叉链表存储表示
typedef struct BTNode
{
char data; //结点数据域
struct BTNode* lchild, * rchild; //左右孩子指针
}BTNode, * BiTree;
//按先序次序创建二叉树,创建二叉链表表示的二叉树T
void PreCreateBiTree(BiTree& T)
{
char ch;
cin >> ch;
if (ch == '#') T = NULL; //递归结束,建空树
else {
T = new BTNode;
T->data = ch; //生成根结点
PreCreateBiTree(T->lchild); //递归创建左子树
PreCreateBiTree(T->rchild); //递归创建右子树
}
}
//复制树
void Copy(BiTree T, BiTree& NewT)
{
if (T == NULL)
{ //如果是空树,递归结束
NewT = NULL;
return;
}
else
{
NewT = new BTNode;
NewT->data = T->data; //复制根结点
Copy(T->lchild, NewT->lchild); //递归复制左子树
Copy(T->rchild, NewT->rchild); //递归复制右子树
}
}
//中序遍历二叉树
void InOrderTraverse(BiTree T)
{
if (T) {
InOrderTraverse(T->lchild);
cout << T->data;
InOrderTraverse(T->rchild);
}
}
void main()
{
BiTree tree, new_tree;
cout << "请输入建立二叉树的序列:\n";
PreCreateBiTree(tree);
cout << "所建立的二叉链表中序序列:\n";
InOrderTraverse(tree);
cout << endl;
Copy(tree, new_tree);
cout << "复制得到的新树的中序序列:\n";
InOrderTraverse(new_tree);
cout << endl;
}
三、二叉树的深度
二叉树的深度为树中结点的最大层次,下面给出其代码实现:
#include<iostream>
using namespace std;
//二叉树的二叉链表存储表示
typedef struct BTNode
{
char data; //结点数据域
struct BTNode* lchild, * rchild; //左右孩子指针
}BTNode, * BiTree;
//按先序次序创建二叉树,创建二叉链表表示的二叉树T
void PreCreateBiTree(BiTree& T)
{
char ch;
cin >> ch;
if (ch == '#') T = NULL; //递归结束,建空树
else {
T = new BTNode;
T->data = ch; //生成根结点
PreCreateBiTree(T->lchild); //递归创建左子树
PreCreateBiTree(T->rchild); //递归创建右子树
}
}
//得到树的深度
int Depth(BiTree T)
{
int m, n;
if (T == NULL) return 0; //如果是空树,深度为0,递归结束
else
{
m = Depth(T->lchild); //递归计算左子树的深度记为m
n = Depth(T->rchild); //递归计算右子树的深度记为n
if (m > n) return(m + 1); //二叉树的深度为m 与n的较大者加1
else return (n + 1);
}
}
void main()
{
BiTree tree;
cout << "请输入建立二叉链表的序列:\n";
PreCreateBiTree(tree);
cout << endl;
cout << "树的深度为:" << Depth(tree) << endl;
}
四、二叉树的结点个数
有时我们需要找到树的结点个数,如下图有七个结点。
下面给出代码实现:
#include<iostream>
using namespace std;
//二叉树的二叉链表存储表示
typedef struct BTNode
{
char data; //结点数据域
struct BTNode* lchild, * rchild; //左右孩子指针
}BTNode, * BiTree;
//按先序次序创建二叉树,创建二叉链表表示的二叉树T
void PreCreateBiTree(BiTree& T)
{
char ch;
cin >> ch;
if (ch == '#') T = NULL; //递归结束,建空树
else {
T = new BTNode;
T->data = ch; //生成根结点
PreCreateBiTree(T->lchild); //递归创建左子树
PreCreateBiTree(T->rchild); //递归创建右子树
}
}
//得到树的结点数
int NodeCount(BiTree T)
{
if (T == NULL) return 0; // 如果是空树,则结点个数为0,递归结束
else return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
//否则结点个数为左子树的结点个数+右子树的结点个数+1
}
void main()
{
BiTree tree;
cout << "请输入建立二叉链表的序列:\n";
PreCreateBiTree(tree);
cout << "结点个数为:" << NodeCount(tree) << endl;
}
总结
路漫漫其修远兮,吾将上下而摆烂。(因为准备其他比赛断学了好久5555)
有任何疑问和补充,欢迎交流。(但我显然不会T_T)