今天学习了二叉树的定义、存储、遍历、查找等。简单记录一下。
二叉树重点在于递归的理解,二叉树的存储创建等。
学习视频:董晓算法
题目1:7.10 创建二叉树——信息学奥赛培训课程_哔哩哔哩_bilibili
#include<bits/stdc++.h>
using namespace std;
typedef struct TNode* BiTree;//定义结点指针类型
struct TNode {
BiTree Left;//指向左子结点
char Data; //结点数据
BiTree Right;//指向右子结点
};
BiTree Root;//指向根结点
char Tree[] = "ABC...D..";//二叉树的前序序列
int t = -1;
void CreateBiTree(BiTree &BT)
{
if (Tree[++t] != '.')
{
BT = new TNode;
BT->Data = Tree[t];
CreateBiTree(BT->Left);
CreateBiTree(BT->Right);
}
else
BT = NULL;
}
void MidOrder(BiTree BT)//输出中序序列
{
if (BT)
{
MidOrder(BT->Left);
cout << BT->Data;
MidOrder(BT->Right);
}
}
void LastOrder(BiTree BT)
{
if (BT)
{
LastOrder(BT->Left);
LastOrder(BT->Right);
cout << BT->Data;
}
}
int main(void)
{
CreateBiTree(Root);
printf("中序序列:");
MidOrder(Root);
printf("\n后序序列:");
LastOrder(Root);
return 0;
}
题目2:P1305 新二叉树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h>
using namespace std;
char a[30][5];
int n;
void f(char ch)
{
if (ch != '*')
{
cout << ch;
for (int i = 1; i <= n; i++)
{
if (ch == a[i][1])
{
f(a[i][2]);
f(a[i][3]);
}
}
}
}
int main(void)
{
cin >> n;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= 3; j++)
{
cin >> a[i][j];
}
}
/*下面查找根结点的方法没有题目3优美*/
int root;
for (int i = 1; i <= n; i++)
{
int flag = 0;
for (int j = 1; j <= n; j++)
{
for (int z = 2; z <= 3; z++)
{
if (a[i][1] == a[j][z])
{
flag = 1;
goto L1;
}
}
}
if (flag == 0)
{
root = i;
break;
}
L1:;
}
f(a[root][1]);
return 0;
}
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int Data[105];//模拟链表存储二叉树
int Left[105];//存储第i个结点左边的儿子
int Right[105];//存储第i个结点右边的儿子
int son[105];//统计儿子出现的序号
int n, flag;
int num = 0;
void find(int x)
{
if (Left[x])
find(Left[x]);
num++;
if (Data[x] == flag)
{
cout << num;
return;
}
if (Right[x])
find(Right[x]);
}
int main(void)
{
cin >> n >> flag;
for (int i = 1; i <= n; i++)
{
cin >> Data[i] >> Left[i] >> Right[i];
son[Left[i]] = 1;
son[Right[i]] = 1;
}
int root;
for (int i = 1; i <= n; i++)
{
if (son[i] == 0)
{
root = i;
break;
}
}
find(root);
return 0;
}